当前位置:网站首页>Flutter Package 插件开发
Flutter Package 插件开发
2022-08-10 05:35:00 【丶咸鱼】
什么是插件
在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_plugin
pluginClass: FlutterLogPlugin
ios:
pluginClass: FlutterLogPlugin
当为更多平台添加插件实现时,应相应地更新platforms map,例如添加macOS和web的hello插件的map:
flutter:
plugin:
platforms:
android:
package: com.example.flutter_log_plugin
pluginClass: FlutterLogPlugin
ios:
pluginClass: FlutterLogPlugin
macos:
pluginClass: FlutterLogPlugin
web:
pluginClass: FlutterLogPlugin
fileName: hello_web.dart
Flutter与Native端通信是通过MethodChannel来互相通信的,所以Flutter与Native中的MethodChannel中的name必须一致
//Flutter 中的 Plugin
static const MethodChannel _channel = MethodChannel('flutter_log_plugin');
//Android 中的 Plugin
@Override
public 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;
@Override
public 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());
}
@Override
public 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();
}
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
public class ToastStreamHandler implements EventChannel.StreamHandler {
@Override
public void onListen(Object arguments, EventChannel.EventSink events) {
Log.i("TAG", "onListen==== " + arguments);
events.success("发送消息去dart: " + arguments);
}
@Override
public void onCancel(Object arguments) {
}
}
}
Flutter中引入日志实现
@override
void 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 hello
flutter 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
边栏推荐
- 详解样条曲线(上)(包含贝塞尔曲线)
- LeetCode 94.二叉树的中序遍历(简单)
- LeetCode 1894. Find the student number that needs to be supplemented with chalk
- LeetCode 2011.执行操作后的变量值(简单)
- 详解 Hough 变换(上)基本原理与直线检测
- LeetCode 1720. Decoding XORed Arrays (Simple)
- 并查集原理与API设计
- Bifrost micro synchronous database implementation services across the library data synchronization
- Common class String overview
- impdp import data
猜你喜欢
随机推荐
21天挑战杯MySQL-Day05
VTK 初步 (1) ----- 可视化管线
pytorch-06.逻辑斯蒂回归
Convolutional Neural Network (CNN) for mnist handwritten digit recognition
LeetCode 1894. Find the student number that needs to be supplemented with chalk
机器学习——聚类——商场客户聚类
Collection工具类
pytorch-11. Convolutional Neural Network (Advanced)
【简易笔记】PyTorch官方教程简易笔记 EP3
LeetCode 1351.统计有序矩阵中的负数(简单)
Explain the principle of MySql index in detail
二维卷积定理的验证(下,cv2.filter2D())
51单片机BH1750智能补光灯台灯光强光照恒流源LED控制系统
LeetCode 剑指offer 10-I.斐波那契数列(简单)
LeetCode 94. Inorder Traversal of Binary Trees (Simple)
LeetCode 2011. Variable Value After Action (Simple)
pytorch-06. Logistic regression
pytorch-09.多分类问题
Consensus calculation and incentive mechanism
Notes for Netual Network



![[Notes] Collection Framework System Collection](/img/6a/f0e69ebb60a3d958ec7bda33a60995.png)





