Flutter-Plugin插件的开发、发布、使用
创建 Plugin
通过命令创建
使用
--org
选项,以反向域名表示法来指定你的组织
flutter create --org com.example --template=plugin 'plugin_name'复制代码
使用
-a
选项指定 Android 的语言,或使用-i
选项指定 iOS 的语言,默认情况下插件项目中 iOS 代码使用 Swift 编写, Android 代码使用 Kotlin 编写
flutter create --org com.example --template=plugin --platforms=android,ios -i objc -a java plugin 'plugin_name'复制代码
通过 Android Studio 创建
创建完成之后可以看到是包含原生代码的,这点和 Package 是不一样的
开发 Plugin
我这里只是增加点代码,示例里面是获取设备版本信息,我这里增加获取电池电量。在 iOS 文件夹下的
PluginDemoPlugin
增加代码
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { if ([@"getPlatformVersion" isEqualToString:call.method]) { result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]); } else if ([@"getBatteryLevel" isEqualToString:call.method]) { int batteryLevel = [self getBatteryLevel]; result (@(batteryLevel)); } else { result(FlutterMethodNotImplemented); } } - (int)getBatteryLevel{ UIDevice *device = [UIDevice currentDevice]; if (device.batteryState == UIDeviceBatteryStateUnknown) { return -1; } return (int)device.batteryLevel*100; }复制代码
在工程的
lib->plugin_demo.dart
里面增加获取电量的 Method 。这里的MethodChannel
是系统默认已经创建好的
static Future<String?> get batteryLevel async { final String? version = await _channel.invokeMethod('getBatteryLevel'); return version; }复制代码
在
example->lib->main.dart
里面增加显示电量
这里通过调用 PluginDemo.batteryLevel
获取电量
Future<void> initBatteryLevel() async { String batteryLevel; try { batteryLevel = await PluginDemo.batteryLevel ?? 'Unknown platform batteryLevel'; } on PlatformException { batteryLevel = 'Failed to get platform batteryLevel.'; } if (!mounted) return; setState(() { _batteryLevel = batteryLevel; }); }复制代码
@override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('Plugin example app'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Running on: $_platformVersion\n'), SizedBox( height: 20, ), Text('Running on: $_batteryLevel\n') ], ), ), ), ); }复制代码
运行代码的效果
发布 Plugin
这个发布流程和发布 package 其实是一样的,具体可以参考这篇文章:juejin.cn/post/703814…
先检查代码有没有问题,这里的许可证一样需要配置
flutter packages pub publish --dry-run复制代码
遇到的问题
当我没有在 pubspec.yaml
配置 homepage
时报这个错误
配置完一个可访问的地址后就没有问题了
没有问题就开始发布,这和发布 package 是一样的
flutter packages pub publish --server=https://pub.dartlang.org复制代码
由于我项目名称叫plugin_demo
, 有重名的需要换一个名称
我重新建了一个flutter_plugin_candy
工程,然后上传,成功了
具体使用和 package 是一样的,可以参考:Flutter-Package插件的开发、发布、使用
欢迎关注、点赞及转发。
作者:周糖果
链接:https://juejin.cn/post/7038750138554122277