flutter插件开发基础教程

前言

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

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

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

创建插件项目

1、文件、新建、新建flutter项目
在这里插入图片描述
2、选择flutter、下一步
在这里插入图片描述
3、维护好基础信息,项目类型选择插件
在这里插入图片描述

开发

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

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

batterylevel_platform_interface.dart定义了一个获取平台接口的方法。
batterylevel_method_channel.dart中重新了该方法,并与原生通信
BatterylevelPlugin.kt 实现了原生逻辑
在这里插入图片描述

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

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

batterylevel_method_channel.dart

/// 获取电池电量

Future<int?> getBatteryLevel() async {
  final level = await methodChannel.invokeMethod<int>('getBatteryLevel');
  return level;
}

BatterylevelPlugin.kt

编写原生代码时,创建一个新的窗口打开安卓部分,这样会有提示,也不会出现报错。
选中项目,鼠标右键
在这里插入图片描述

打开后,两边对照一下,别打开错了。
在这里插入图片描述

/** 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<int?> getBatteryLevel() {
  return BatterylevelPlatform.instance.getBatteryLevel();
}

测试

在插件的example里测试

example下的main.dart
在这里插入图片描述

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _batterylevelPlugin = Batterylevel();

  // 电量
  String batteryLevel = '';

  
  void initState() {
    super.initState();
    initPlatformState();
  }

  ///获取版本号
  Future<void> 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<void> getBatteryLevel() async {
    try {
      int res = await _batterylevelPlugin.getBatteryLevel() ?? 0;
      batteryLevel = res.toString();
    } on PlatformException {
      batteryLevel = 'Failed to get battery level.';
    }
    // 更新
    setState(() {});
  }

  
  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项目里加载本地的这个插件

最开始是打算直接在项目里引入插件的,奈何引入后一直提示路径不对。因此改成通过git引入
1、将你的插件提交到git仓库
2、在flutter项目的pubspec.yaml引入插件
在这里插入图片描述
3、运行 flutter pub get 获取依赖

下载的依赖一般都在用户目录下,如下图
在这里插入图片描述
在这里插入图片描述
4、就跟其他依赖一样,正常使用即可

class _MyHomePageState extends State<MyHomePage> {
  // 获取电池电量的本地插件
  final Batterylevel batteryLevel = Batterylevel();
  // 当前电量
  int batteryLevelValue = 0;

  
  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: <Widget>[
            Text("当前电量是:$batteryLevelValue"),
            ElevatedButton(
                child: const Text("获取电量"),
                onPressed: () async {
                  int res = await batteryLevel.getBatteryLevel() ?? 0;
                  setState(() {
                    batteryLevelValue = res;
                  });
                })
          ],
        ),
      ),
    );
  }
}

在这里插入图片描述

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Flutter开发文档是针对Flutter框架的官方文档,提供了全面的开发指南和参考资料。它包括了Flutter框架的概述,安装和配置指南,以及各种用于构建高性能跨平台应用的工具和资源。 首先,Flutter开发文档介绍了Flutter框架的基本概念和原理,包括如何使用Widget构建用户界面以及如何处理用户输入和交互。开发者可以通过这些指南来了解Flutter的整体架构和核心特性,从而更好地理解和利用Flutter进行应用开发。 其次,Flutter开发文档提供了丰富的API参考和使用示例,使开发者能够快速上手和深入了解各种Flutter组件和功能。开发者可以通过文档中的代码示例和详细说明来学习如何使用不同的Widget和布局进行界面设计,以及如何调用Flutter提供的各种API实现更复杂的业务逻辑。 此外,Flutter开发文档还详细介绍了Flutter开发工具和调试技巧,包括如何使用命令行工具进行项目管理和发布,如何使用集成开发环境(IDE)进行开发和调试,以及如何使用Flutter的调试工具来定位和解决应用中的问题。这些指南和建议可以帮助开发者提高开发效率,减少错误和调试时间。 总之,Flutter开发文档是学习和使用Flutter进行应用开发的重要参考资料。它提供了全面的开发指南和参考资料,帮助开发者快速上手和精通Flutter开发,实现高性能、跨平台的应用程序。对于初学者来说,阅读Flutter开发文档是入门的首要步骤,对于有经验的开发者来说,它是进一步提升技能和应用开发水平的宝贵资源。 ### 回答2: Flutter是Google推出的一种用于构建跨平台移动应用的开源框架。它具有快速开发、高效性能和灵活可扩展等特点。Flutter开发文档非常详细全面,为开发者提供了丰富的资源和指导。 首先,Flutter开发文档提供了完整的安装指南,让开发者能够快速搭建开发环境,并且支持多个操作系统,包括Windows、MacOS和Linux等。开发者只需按照文档中的步骤进行配置,即可开始使用Flutter进行开发。 其次,Flutter开发文档提供了丰富的基础知识和概念介绍,帮助开发者了解Flutter的整体架构和工作原理。文档中详细介绍了Flutter的Widget系统,以及如何使用Widget来构建用户界面。此外,文档还提供了许多关于布局、动画和主题等方面的教程和示例代码,帮助开发者快速上手。 另外,Flutter开发文档还包含了大量的API文档,涵盖了Flutter框架的核心功能和各种组件的使用方法。开发者可以根据需要查阅相应的API文档,了解每个组件的属性、方法和事件等详情。同时,文档还提供了一系列示例代码,让开发者能够更好地理解和运用这些组件。 最后,Flutter开发文档还提供了丰富的实用资源和工具,包括开发工具的介绍和配置、Flutter包管理和依赖管理等。开发者可以通过文档中提供的链接和教程,快速了解和使用这些工具,提高开发效率。 总的来说,Flutter开发文档对于开发者来说是非常宝贵的资源,通过详细的介绍和实用的示例,帮助开发者快速入门和深入理解Flutter框架,从而能够更高效地开发出跨平台的移动应用。 ### 回答3: Flutter开发文档是Flutter官方提供的一份详尽的技术文档,用于指导Flutter开发者学习和使用Flutter框架。文档详细地介绍了Flutter的各个方面,包括安装配置、基本概念、核心组件、布局系统、用户界面、动画、手势、插件等内容。 首先,文档提供了Flutter的安装配置指南,指导开发者如何搭建开发环境,并使用Flutter SDK进行应用开发。同时,文档还介绍了Flutter的基本概念和工作原理,帮助开发者理解Flutter的核心特性和优势。 其次,文档详细介绍了Flutter的核心组件,包括Widget、State、BuildContext等,开发者可以了解到如何使用这些组件构建复杂的用户界面。同时,文档还深入介绍了Flutter的布局系统,包括Row、Column、Stack等布局组件的用法,并提供了示例代码和案例说明。 此外,文档还介绍了Flutter的用户界面设计,包括样式、字体、图片等的使用方法,以及界面的响应事件和动画效果的实现。开发者可以通过文档了解到如何构建出令人满意的用户界面和用户交互效果。 最后,文档还提供了Flutter插件开发方法和使用指南,通过插件可以扩展Flutter的功能和接入原生平台的特性,帮助开发者实现更复杂的应用需求。 总而言之,Flutter开发文档是一份权威且详细的技术指南,对于Flutter开发者来说是不可或缺的参考材料。通过学习和使用文档中的知识,开发者可以更加高效地进行Flutter应用的开发和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无知的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值