什么是插件

在flutter中,一个插件叫做一个package,使用packages的目的就是为了达到模块化,可以创建出可被复用和共享的代码,创建出来的package可以在pubspec.yaml中直接依赖。

Package介绍

pubspec.yaml文件:用于定义package名称、版本号、作者等其他信息的元数据文件。
lib目录:包含共享代码的lib目录,其中至少包含一个<package-name>.dart文件。<package-name>.dart这个文件必须在,因为这是方便使用的人快速import这个package来使用它,可以把它理解成一种必须要遵守的规则。

package的分类

  • Dart packages(纯Dart库):这是一个只有dart代码的package,里面包含了flutter的特定功能,所以它依赖于flutter的framework,也决定了它只能用在flutter上。
  • plugin packages(原生插件):Dart编写,按需使用Java或者Kotlin、Objective-C或Swift分别在Android/ios平台实现的package。

开发Dart的packages

Flutter创建插件

使用android studio新建工程,New -> New Flutter Project -> Flutter plugin,插件名称不支持大写开头。

几个主要的目录分别为android,example,ioslib这四个目录:

  • android目录是一个完整的android工程,用来开发Android端的插件功能
  • example目录是一个完整的Flutter工程,可运行安装,用来测试Android或者ios端的插件功能
  • ios目录是一个完整的ios工程,用来开发ios端的插件功能
  • lib目录中的文件负责和Android或者ios端的交互,dart文件

注意:在打开Android对应的java或者kotlin类时文件会报错报红色警告,这是正常的。只需要点击编辑框右上角open for Editing in Android Studio 即可打开android工程编辑。

插件指定平台

flutter:plugin:platforms://支持的平台android:package: com.example.flutter_log_pluginpluginClass: FlutterLogPluginios:pluginClass: FlutterLogPlugin

当为更多平台添加插件实现时,应相应地更新platforms map,例如添加macOS和web的hello插件的map:

flutter:plugin:platforms:android:package: com.example.flutter_log_pluginpluginClass: FlutterLogPluginios:pluginClass: FlutterLogPluginmacos:pluginClass: FlutterLogPluginweb:pluginClass: FlutterLogPluginfileName: hello_web.dart

Flutter与Native端通信是通过MethodChannel来互相通信的,所以Flutter与Native中的MethodChannel中的name必须一致

  //Flutter 中的 Pluginstatic const MethodChannel _channel = MethodChannel('flutter_log_plugin');//Android 中的 Plugin@Overridepublic void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "flutter_log_plugin");channel.setMethodCallHandler(this);}

例子:定义一个日志输出的插件

在插件的lib下定义一个插件实现的方法

class FlutterLogPlugin {static const MethodChannel _channel = MethodChannel('flutter_log_plugin');//定义一个日志输出的桥接方法static void i(String tag, String message){_channel.invokeMethod("logI",{"tag":tag,"message":message});}static Future<String?> get platformVersion async {final String? version = await _channel.invokeMethod('getPlatformVersion');return version;}
}

在android目录下点击右上角的open for Editing in Android Studio 进入android项目编写原生插件交互

public class FlutterLogPlugin implements FlutterPlugin, MethodCallHandler {private MethodChannel channel;private EventChannel eventChannel;@Overridepublic void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "flutter_log_plugin");channel.setMethodCallHandler(this);eventChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), "flutter_event_channel");eventChannel.setStreamHandler(new ToastStreamHandler());}@Overridepublic void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {if (call.method.equals("getPlatformVersion")) {result.success("Android " + android.os.Build.VERSION.RELEASE);} else if (call.method.equals("logI")) {String tag = call.argument("tag");String msg = call.argument("message");Log.i(tag, msg);} else {result.notImplemented();}}@Overridepublic void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {channel.setMethodCallHandler(null);}public class ToastStreamHandler implements EventChannel.StreamHandler {@Overridepublic void onListen(Object arguments, EventChannel.EventSink events) {Log.i("TAG", "onListen==== " + arguments);events.success("发送消息去dart: " + arguments);}@Overridepublic void onCancel(Object arguments) {}}
}

Flutter中引入日志实现

  @overridevoid initState() {super.initState();FlutterLogPlugin.i("TAG", "log.................");_eventChannel.receiveBroadcastStream("com.test.android.event").listen((event) {print('event from ' + _platformVersion + " " + event.toString());});initPlatformState();}


Flutter与Native通信有3个方法:

  • MethodChannel:Flutter与Native端相互调用,调用后可以返回结果,可以Native端主动调用,也可以Flutter主动调用,属于双端通信。此方式为最常用的方式,Native端调用需要在主线程中执行
  • BasicMessageChannel:用于使用指定的编解码器对消息进行编解码,属于双向通信,可以Native端主动调用,也可以Flutter主动调用。
  • EventChannel:用于数据流(event streams)的通信,Native端主动发送数据给Flutter,通常用于状态监听等。

发布Flutter插件

通过命令行cmd,进入到项目地址的目录下运行dry-run

flutter pub publish --dry-run

在发布时检查通过后才能发布

flutter pub publish
//设置了中国镜像的开发者们请注意:目前所存在的镜像都不能(也不应该)进行 package 的上传。如果你设置了镜像,执行上述发布代码可能会造成发布失败。网络设定好后,无需取消中文镜像,执行下述代码可直接上传
flutter pub publish --server=https://pub.dartlang.org

国内发布看运气的,需要谷歌账号

通过命令行创建插件

-a 选项指定Android的语言,或使用-i选项指定ios的语言。

flutter create --org com.example --template=plugin --platforms=android,ios -a kotlin helloflutter create --org com.example --template=plugin --platforms=android,ios -i swift hello
flutter create --org com.example --template=plugin --platforms=android,ios -i objc hello

参考文档:(https://flutter.cn/docs/development/packages-and-plugins/developing-packages

Flutter Package 插件开发相关推荐

  1. flutter ios 插件开发 appcode 加快索引速度

    ios插件开发可以查看之前的文章 本篇就不详细介绍了 众所周知xcode这编辑器除了漂亮,其实开发效率来说和appcode无法相提并论- 本篇与插件开发本身无关,目的只是为了加快appcode的索引速 ...

  2. flutter原生插件开发--IOS端

    简介 做Flutter开发肯定会需要自定义插件,下面我把自己开发的插件的Demo分享出来,希望可以对新手小白有点帮助. 准备工作 需要一台Mac设备,安装Android Stodio.Xcode,及搭 ...

  3. Flutter插件开发--获取Android手机电池信息

    由于我不会做IOS开发,文章里面没有IOS的代码.下面的参考教程里有具体的IOS代码 参考教程:flutter中文网–Flutter实战–插件开发,平台介绍和实现Android端API  最后的执行效 ...

  4. Flutter Dart问题记录 - Package类型项目的平台支持

    文章目录 前言 开发环境 问题描述 问题分析 解决方案 总结 最后 前言 在Flutter问题记录 - Flutter插件创建Package项目报错:At least one platform mus ...

  5. Flutter Plugin开发流程

    这篇文章主要介绍了Flutter Plugin开发流程,包括如何利用Android Studio开发以及发布等. 本文主要给大家介绍如何开发Flutter Plugin中Android的部分.有关Fl ...

  6. Flutter学习笔记学习资料推荐,手机端开发工具

    打开该目录下的flutter.gradle文件修改如下内容: buildscript { repositories { //google() //jcenter() maven { url 'http ...

  7. Flutter学习笔记学习资料推荐

    对Flutter的学习已经有一段时间了,这里做一下总结记录,东西比较多,可能主要是一些学习资料的记录,还有一些杂七杂八的学习笔记. 文章目录 Flutter 初体验 Flutter 环境配置 Flut ...

  8. Flutter 笔记 | Flutter 文件IO、网络请求、JSON、日期与国际化

    文件IO操作 Dart的 IO 库包含了文件读写的相关类,它属于 Dart 语法标准的一部分,所以通过 Dart IO 库,无论是 Dart VM 下的脚本还是 Flutter,都是通过 Dart I ...

  9. flutter和webapp_Flutter全平台!迁移现有Flutter项目到WEB端

    写在前面 Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台.高保真.高性能.开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS .Android.web和桌面 ...

  10. 从 Flutter 的视频渲染到 App 落地经验

    3月23日周六,由 RTC 开发者社区主办的 "RTC Dev Meetup 北京站"如约举行,超过100位求知若渴的开发者参加了活动.来自 LeanCloud.声网 Agora. ...

最新文章

  1. 【数学与算法】二部图、匈牙利匹配、稳定婚配
  2. php中的isset函数,PHP函数isset()只能用于变量
  3. redis 慢查询日志
  4. C#下如何实现服务器 + 客户端的聊天程序
  5. 解码错误。‘gb2312‘ codec can‘t decode byte 0xf3 in position 307307: illegal multibyte sequence
  6. 关闭mysql密码策略_MYSQL57密码策略修改
  7. CF876 D 树状数组
  8. 平板触控笔有哪些用途?实用平板电脑手写电容笔推荐
  9. 1t硬盘怎么分区最好_1TB硬盘如何分区
  10. NLP/常用数据集简介
  11. Adobe国际认证设计师证书含金量怎么样?
  12. 使用iozone测试磁盘性能(测试文件读写)
  13. (CHM-Software)工具集锦
  14. POJ 3608 Bridge Across Islands(凸包最近对踵点对)
  15. linux内核 can总线,嵌入式Linux下CAN总线配置
  16. EXECryptor 2.4.1 Private Build [10 Oct 2007]
  17. jq 给按钮添加方法_告别存储烦恼,4种快速将M2TS格式转换为MKV的方法。
  18. Tensorboard 1.13.1的使用,及遇到的几个问题
  19. 十一、Redis Cluster模式
  20. erp5开源制造业erp外协加工设置

热门文章

  1. csp202112-1:序列查询 题解
  2. webpack随笔06-bulma
  3. _crol_和_cror_的使用
  4. 如何打开usb计算机连接打印机驱动,打印机USB连接安装设置及常见问题处理
  5. Altium Designer——usb信号线布线注意的问题——应使用差分布线
  6. gmail邮箱注册成功流程
  7. Typora恢复忘记保存的文件
  8. FSR402电阻式薄膜压力传感器
  9. 12个顶级思维模型,非常值得一看!
  10. Apache与Tomcat有什么关系和区别