阅读 199

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 创建

截屏2021-12-05 下午7.12.08.png

创建完成之后可以看到是包含原生代码的,这点和 Package 是不一样的

截屏2021-12-05 下午7.42.42.png

开发 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')
          ],
        ),
      ),
    ),
  );
}复制代码

运行代码的效果

Simulator Screen Shot - iPhone 12 Pro Max - 2021-12-05 at 19.50.20.png

发布 Plugin

这个发布流程和发布 package 其实是一样的,具体可以参考这篇文章:juejin.cn/post/703814…

  • 先检查代码有没有问题,这里的许可证一样需要配置

flutter packages pub publish --dry-run复制代码

遇到的问题

当我没有在 pubspec.yaml 配置 homepage 时报这个错误

截屏2021-12-05 下午7.54.09.png

配置完一个可访问的地址后就没有问题了

截屏2021-12-05 下午7.57.11.png

  • 没有问题就开始发布,这和发布 package 是一样的

flutter packages pub publish --server=https://pub.dartlang.org复制代码

由于我项目名称叫plugin_demo, 有重名的需要换一个名称

截屏2021-12-05 下午8.05.02.png

我重新建了一个flutter_plugin_candy工程,然后上传,成功了

截屏2021-12-05 下午8.28.21.png

截屏2021-12-05 下午8.29.51.png

具体使用和 package 是一样的,可以参考:Flutter-Package插件的开发、发布、使用

欢迎关注、点赞及转发。


作者:周糖果
链接:https://juejin.cn/post/7038750138554122277


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐