Flutter Package 插件开发
什么是插件
在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,ios,lib这四个目录:
- 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 插件开发相关推荐
- flutter ios 插件开发 appcode 加快索引速度
ios插件开发可以查看之前的文章 本篇就不详细介绍了 众所周知xcode这编辑器除了漂亮,其实开发效率来说和appcode无法相提并论- 本篇与插件开发本身无关,目的只是为了加快appcode的索引速 ...
- flutter原生插件开发--IOS端
简介 做Flutter开发肯定会需要自定义插件,下面我把自己开发的插件的Demo分享出来,希望可以对新手小白有点帮助. 准备工作 需要一台Mac设备,安装Android Stodio.Xcode,及搭 ...
- Flutter插件开发--获取Android手机电池信息
由于我不会做IOS开发,文章里面没有IOS的代码.下面的参考教程里有具体的IOS代码 参考教程:flutter中文网–Flutter实战–插件开发,平台介绍和实现Android端API 最后的执行效 ...
- Flutter Dart问题记录 - Package类型项目的平台支持
文章目录 前言 开发环境 问题描述 问题分析 解决方案 总结 最后 前言 在Flutter问题记录 - Flutter插件创建Package项目报错:At least one platform mus ...
- Flutter Plugin开发流程
这篇文章主要介绍了Flutter Plugin开发流程,包括如何利用Android Studio开发以及发布等. 本文主要给大家介绍如何开发Flutter Plugin中Android的部分.有关Fl ...
- Flutter学习笔记学习资料推荐,手机端开发工具
打开该目录下的flutter.gradle文件修改如下内容: buildscript { repositories { //google() //jcenter() maven { url 'http ...
- Flutter学习笔记学习资料推荐
对Flutter的学习已经有一段时间了,这里做一下总结记录,东西比较多,可能主要是一些学习资料的记录,还有一些杂七杂八的学习笔记. 文章目录 Flutter 初体验 Flutter 环境配置 Flut ...
- Flutter 笔记 | Flutter 文件IO、网络请求、JSON、日期与国际化
文件IO操作 Dart的 IO 库包含了文件读写的相关类,它属于 Dart 语法标准的一部分,所以通过 Dart IO 库,无论是 Dart VM 下的脚本还是 Flutter,都是通过 Dart I ...
- flutter和webapp_Flutter全平台!迁移现有Flutter项目到WEB端
写在前面 Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台.高保真.高性能.开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS .Android.web和桌面 ...
- 从 Flutter 的视频渲染到 App 落地经验
3月23日周六,由 RTC 开发者社区主办的 "RTC Dev Meetup 北京站"如约举行,超过100位求知若渴的开发者参加了活动.来自 LeanCloud.声网 Agora. ...
最新文章
- 【数学与算法】二部图、匈牙利匹配、稳定婚配
- php中的isset函数,PHP函数isset()只能用于变量
- redis 慢查询日志
- C#下如何实现服务器 + 客户端的聊天程序
- 解码错误。‘gb2312‘ codec can‘t decode byte 0xf3 in position 307307: illegal multibyte sequence
- 关闭mysql密码策略_MYSQL57密码策略修改
- CF876 D 树状数组
- 平板触控笔有哪些用途?实用平板电脑手写电容笔推荐
- 1t硬盘怎么分区最好_1TB硬盘如何分区
- NLP/常用数据集简介
- Adobe国际认证设计师证书含金量怎么样?
- 使用iozone测试磁盘性能(测试文件读写)
- (CHM-Software)工具集锦
- POJ 3608 Bridge Across Islands(凸包最近对踵点对)
- linux内核 can总线,嵌入式Linux下CAN总线配置
- EXECryptor 2.4.1 Private Build [10 Oct 2007]
- jq 给按钮添加方法_告别存储烦恼,4种快速将M2TS格式转换为MKV的方法。
- Tensorboard 1.13.1的使用,及遇到的几个问题
- 十一、Redis Cluster模式
- erp5开源制造业erp外协加工设置