Flutter 自定义插件基础
1、Flutter插件是什么?官方插件库
在开发Flutter应用过程中会涉及到平台相关接口调用,例如数据库操作、相机调用、外部浏览器跳转等业务场景。其实Flutter自身并不支持直接在平台上实现这些功能,而是通过插件包接口去调用指定平台API从而实现原生平台上特定功能。
2、Flutter插件的目录结构
- lib 是对接dart端代码的入口,由此文件接收到参数后,通过channel将数据发送到原生端
- android 安卓端代码实现目录
- ios iOS原生端实现目录
- example 一个依赖于该插件的Flutter应用程序,来说明如何使用它
- README.md:介绍包的文件
- CHANGELOG.md 记录每个版本中的更改
- LICENSE 包含软件包许可条款的文件
3、Flutter插件包的创建方式
3.1 使用命令行创建
flutter create --template=package hello
可以通过–org指定包标识符
flutter create --template=package hello
通过参数指定iOS和Android代码使用的语言类型
flutter create --template=plugin -i swift -a kotlin hello
3.2 使用AS直接new工程
4、Flutter插件功能编写
Flutter插件模板生成后,在lib文件夹下会自动生成一个对外的入口dart类,该插件所包含的所有功能都以此类为入口,来提供外部进行调用。
platformVersion 是对外的方法调用,但是方法内部的实现逻辑,是通过原生端去获取的。对应Android原生端的入口文件如下:
监听来自dart端的请求,需要继承MethodChannel.MethodCallHandler接口,然后在onMethodCall方法回调中处理和返回给dart端数据逻辑。
result是给dart端回传最后结果的,如果dart不需要返回结果,也可以不调用
result.success(Object o)
如果一些简单的需求,可以直接在此处的plugin里实现,最后将结果直接返回。但是比如调起相机拍照,选取通讯录联系人,这些都要打开一个intent然后在OnActivityResult方法中去获取最终的结果,这种情况下如何处理呢?
继承 PluginRegistry.ActivityResultListener 接口
注意!!! >
直接将源码放在项目中的插件,在运行时候onActivityResult方法是不会被调用的,因为MainActivity中的onActivityResult将调用动作拦截了下来,所以必须将插件放在远端仓库中才可以正常接收
5、Flutter插件的两种注册方式
5.1 通过 registerWith 方式注册,早期非常老旧的方式
registerWith方式是通过反射进行加载
目前老版本项目里的插件都是使用这种方式注册,但是从flutter v1.12.x
开始往后官方推荐使用第二种方式注册,第一种方式会在以后的更新中废除,所以以后更新flutter大版本,可能要重新修改现有插件的注册方式
5.2 通过Flutter引擎注册
在Flutter1.12.X版本中正式将Embedding-V2API在Android平台默认开启,所有官方插件都迁移到了新的API。Embedding-V2APi的优势在于针对混合开发提供了更好的支持和内存上的优化
插件的注册方式定义在工程的android端的mainfest.xml文件中,如下所示:
<meta-dataandroid:name="flutterEmbedding"android:value="2" />
在插件的plugin文件中,继承FlutterPlugin接口,使用以下新的方式进行初始化
如需获取当前插件依附的activity,也就是mainActivity,则需要plugin集成ActivityAware接口,然后通过回调获取
6、Flutter 与原生之间如何交互
Flutter与原生的交互模型,类似于一种C-S模型。其中Flutter为Client层,原生为Server层,两者通过MethodChannel进行消息通信,原生端向Flutter提供已有的Native组件功能。
在客户端,MethodChannel允许发送与方法调用相对应的消息。
在平台方面,Android上的MethodChannel和iOS上的FlutterMethodChannel启用接收方法调用并返回结果。
这些类允许你使用非常少的"样板"代码开发平台插件。
Flutter与原生的消息传递采用标准信息编解码器,是一种相对高效的二进制序列化与反序列化。当接收跟发送消息时,这些值在消息中会自动进行序列化与反序列化。
6.1 什么是MethodChannel?
Flutter定义了3种channel模型:
- BasicMessageChannel:用于传递字符串和半结构化的信息
- MethodChannel:用于传递方法调用(method invocation)
- EventChannel: 用于数据流(event streams)的通信
6.2 Flutter 与原生之间的通信流程
首先从dart层调用
_channel.invokeMethod("方法名",参数)
- invoke方法会将传入的方法名与参数封装成MethodCall对象
- 然后通过MethodCodec对MethodCall对象进行编码,形成二进制格式。
- 然后通过BinaryMessenger的send方法,将二进制格式的数据进行发送
6.3 MethodChannel是什么时候注册,和MethodHandler联系起来的呢?
在插件运行的时候,我们会调用插件的registerWith方法,在生成MethodChannel对象时,同时向MethodChannel注册了一个MethodHandler,MethodHandler对象跟MethodChannel对象是一一对应的。
7、原生和Flutter之间数据交互的类型限制
8、插件包的发布
在发布Flutter插件时,可以使用appuploader工具来帮助处理iOS端的打包和上传工作。appuploader是一款专业的iOS开发辅助工具,可以简化证书管理、描述文件配置等繁琐流程,让开发者更专注于插件功能的实现。
Flutter 编写插件flutter_plugin(包含Android、iOS)实现过程
随着Flutter 日渐成熟,使用Flutter 也越来越多,作为一个跨平台的语言,他的展示效果和操作流畅度 可以和原生媲美,这也Flutter越来越受欢迎的原因。
虽然Flutter 越来越强大,但是总有一些力不从心的时候,现在大厂开发的SDK 如 极光推送、地图 等插件 并没有提供 Flutter版本,而我们使用的插件也是 一些开发者自己进行实现的,而对于一些冷门的插件,是根本没有,但是在开发过程中我们又要使用到。这个时候我们就要自己写一些插件了。
插件介绍
1、创建插件
这里我是不勾选的,使用java、oc,这个是否选择看大家习惯,这里我是不建议勾选的
点击完成后,插件就创建完成了。
2、插件目录
- Android 就是我们开发安卓部分的位置
- iOS 就是我们开发 iOS 的位置
- lib 是与 Android 、iOS 联调的位置。也可以理解为Flutter 实现的位置
- example 是测试的位置,当我们写完插件 可以直接运行 插件,example 可以理解为一个Flutter项目,只不过这个项目只给你写的插件服务
到此 插件就介绍了完了,下面开始进行代码实现。
Flutter部分
1、添加原生、Flutter交互渠道
我们打开插件,找到lib ,在lib下面会有一个文件 FlutterPluginTest_1,在这个基础上我们进行扩展,更加灵活
2、Flutter界面讲解
我们创建一个新类,叫TestView,位置和FlutterPluginTest_1并列即可。
3、Flutter调用
上面介绍到example是测试的地方,下面我就在这里进行使用,我们找main.dart,然后调用。
iOS、Android介绍
iOS部分
iOS 找到 ios 目录,选择Reveal in Finder,因为现在这个ios 部分还没有pod install,我们这要先进行pod install,成功后直接打开项目即可
Android 部分
Android 我们也右键在工具中打开,然后如下图找到位置,Android 所有的代码都在这里进行
iOS FlutterPluginTest_1Plugin
Android FlutterPluginTest_1Plugin(由于和iOS代码一致,这里不做过多介绍)
iOS TestFlutterPluginViewFactory
Android TestFlutterPluginViewFactory
iOS TestFlutterPluginView
Android TestFlutterPluginView
到此,插件的开发就算是完事了。实现的效果如下
下面就是使用这个插件了,我们如何集成到 别的项目里,在这里 我们只介绍 本地 使用
其实本地使用非常简单。
1、打开我们的项目
2、打开pubspec.yaml
3、引入依赖
4、pub get
到此就引用完成了。
5、使用我们就和example 里面一摸一样就可以了。
在开发过程中,如果需要将插件发布到App Store,可以使用appuploader来简化iOS端的打包和上传流程。appuploader提供了直观的界面操作,可以轻松管理证书、描述文件,并支持一键上传ipa文件到App Store Connect,大大提高了开发效率。
到此我们就完成了插件的 创建 和使用,大家有什么可以随时评论区留言。