flutter插件开发基础教程

2024-05-29 1218阅读

前言

虽然现在已经有很多插件了,但是有时候还是需要自己开发一个插件。因此打算学习一下如何开发一个插件。这里只考虑安卓,安卓使用kotlin,kotlin不会也没事,我也不会。

参考项目:https://github.com/TBoyLi/flutter_plugin_learning

参考教程:https://www.jianshu.com/p/9fc6747fc7c4

创建插件项目

1、文件、新建、新建flutter项目

flutter插件开发基础教程

2、选择flutter、下一步

flutter插件开发基础教程

3、维护好基础信息,项目类型选择插件

flutter插件开发基础教程

开发

项目目录如下,后续需要编写的文件是

  • BatterylevelPlugin.kt 编写原生代码
  • batterylevel.dart 编写dart代码,flutter项目中会使用该文件
  • batterylevel_method_channel.dart 用于编写与原生通信的逻辑
  • batterylevel_platform_interface.dart 定义了需要实现哪些方法

    flutter插件开发基础教程

    在batterylevel_platform_interface.dart定义了一个获取平台接口的方法。

    在batterylevel_method_channel.dart中重新了该方法,并与原生通信

    在BatterylevelPlugin.kt 实现了原生逻辑

    flutter插件开发基础教程

    安装上面的方式,我们定义一个获取当前电量的方法。

    batterylevel_platform_interface.dart

     // 获取电池电量
     Future getBatteryLevel() {
       throw UnimplementedError('getBatteryLevel() has not been implemented.');
     }
    

    batterylevel_method_channel.dart

    /// 获取电池电量
    @override
    Future getBatteryLevel() async {
      final level = await methodChannel.invokeMethod('getBatteryLevel');
      return level;
    }
    

    BatterylevelPlugin.kt

    编写原生代码时,创建一个新的窗口打开安卓部分,这样会有提示,也不会出现报错。

    选中项目,鼠标右键

    flutter插件开发基础教程

    打开后,两边对照一下,别打开错了。

    flutter插件开发基础教程

    /** BatterylevelPlugin */
    class BatterylevelPlugin: FlutterPlugin, MethodCallHandler {
      private lateinit var channel : MethodChannel
      // 获取上下文对象
      private var applicationContext: Context? = null
      // 注册插件到flutter引擎
      override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
        // 上下文对象
        applicationContext = flutterPluginBinding.applicationContext
        // 创建通道
        channel = MethodChannel(flutterPluginBinding.binaryMessenger, "batterylevel")
        channel.setMethodCallHandler(this)
      }
      override fun onMethodCall(call: MethodCall, result: Result) {
        // 判断通信方法的名称,实现获取平台版本
        if (call.method == "getPlatformVersion") {
          result.success("Android ${android.os.Build.VERSION.RELEASE}")
        } else if(call.method=="getBatteryLevel"){
           // 返回电量
          val batteryLevel = getBatteryLevel()
          if (batteryLevel != -1) {
            result.success(batteryLevel)
          } else {
            result.error("UNAVAILABLE", "Battery level not available.", null)
          }
        }
        else {
          result.notImplemented()
        }
      }
      // 获取电池电量
      private fun getBatteryLevel(): Int {
        var batteryLevel = -1
        batteryLevel = if (VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          val batteryManager = applicationContext?.let { getSystemService(it, BatteryManager::class.java) }
          batteryManager!!.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
        } else {
          val intent = ContextWrapper(applicationContext).registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
          (intent?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) ?: -1) * 100 / (intent?.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
            ?: -1)
        }
        return batteryLevel
      }
      override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        channel.setMethodCallHandler(null)
      }
    }
    

    batterylevel.dart

    // 获取电池电量
    Future getBatteryLevel() {
      return BatterylevelPlatform.instance.getBatteryLevel();
    }
    

    测试

    在插件的example里测试

    example下的main.dart

    flutter插件开发基础教程

    class _MyAppState extends State {
      String _platformVersion = 'Unknown';
      final _batterylevelPlugin = Batterylevel();
      // 电量
      String batteryLevel = '';
      @override
      void initState() {
        super.initState();
        initPlatformState();
      }
      ///获取版本号
      Future initPlatformState() async {
        String platformVersion;
        // Platform messages may fail, so we use a try/catch PlatformException.
        // We also handle the message potentially returning null.
        try {
          platformVersion = await _batterylevelPlugin.getPlatformVersion() ??
              'Unknown platform version';
        } on PlatformException {
          platformVersion = 'Failed to get platform version.';
        }
        if (!mounted) return;
        setState(() {
          _platformVersion = platformVersion;
        });
      }
      // 获取电量
      Future getBatteryLevel() async {
        try {
          int res = await _batterylevelPlugin.getBatteryLevel() ?? 0;
          batteryLevel = res.toString();
        } on PlatformException {
          batteryLevel = 'Failed to get battery level.';
        }
        // 更新
        setState(() {});
      }
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Plugin example app'),
            ),
            body: Center(
              child: Column(
                children: [
                  Text('Running on: $_platformVersion\n'),
                  Text('电量:$batteryLevel\n'),
                  ElevatedButton(onPressed: (){
                    getBatteryLevel();
                  }, child: const Text("获取电量"))
                ],
              ),
            ),
          ),
        );
      }
    }
    

    flutter插件开发基础教程

    在flutter项目里加载本地的这个插件

    最开始是打算直接在项目里引入插件的,奈何引入后一直提示路径不对。因此改成通过git引入

    1、将你的插件提交到git仓库

    2、在flutter项目的pubspec.yaml引入插件

    flutter插件开发基础教程

    3、运行 flutter pub get 获取依赖

    下载的依赖一般都在用户目录下,如下图

    flutter插件开发基础教程

    flutter插件开发基础教程

    4、就跟其他依赖一样,正常使用即可

    class _MyHomePageState extends State {
      // 获取电池电量的本地插件
      final Batterylevel batteryLevel = Batterylevel();
      // 当前电量
      int batteryLevelValue = 0;
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            backgroundColor: Theme.of(context).colorScheme.inversePrimary,
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text("当前电量是:$batteryLevelValue"),
                ElevatedButton(
                    child: const Text("获取电量"),
                    onPressed: () async {
                      int res = await batteryLevel.getBatteryLevel() ?? 0;
                      setState(() {
                        batteryLevelValue = res;
                      });
                    })
              ],
            ),
          ),
        );
      }
    }
    

    flutter插件开发基础教程

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]