创立 Plugin

经过命令创立

  • 运用 --org 选项,以反向域名表明法来指定你的组织
flutter create--orgcom.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'

常用Flutter命令和快捷键能够参阅:Flutter-最全常用快捷键

在 package 里边把上传常见的问题都列举了出来,这篇没有细心列出问题,能够参阅:Flutter-Package插件的开发、发布、运用

经过 Android Studio 创立

Flutter-Plugin插件的开发、发布、使用

创立完结之后能够看到是包括原生代码的,这点和 Package 是不相同的

Flutter-Plugin插件的开发、发布、使用

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

运转代码的作用,由于我运转的是模拟器没有获取到电量

Flutter-Plugin插件的开发、发布、使用

发布 Plugin

这个发布流程和发布 package 其实是相同的,具体能够参阅这篇文章:Package插件的开发、发布、运用

  • 先查看代码有没有问题,这儿的许可证相同需求装备
flutter packages pub publish --dry-run

遇到的问题

当我没有在 pubspec.yaml 装备 homepage 时报这个错误

Flutter-Plugin插件的开发、发布、使用

装备完一个可访问的地址后就没有问题了

Flutter-Plugin插件的开发、发布、使用

  • 没有问题就开端发布,这和发布 package 是相同的
flutter packages pub publish --server=https://pub.dartlang.org

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

Flutter-Plugin插件的开发、发布、使用

我从头建了一个flutter_plugin_candy工程,然后上传,成功了

Flutter-Plugin插件的开发、发布、使用

Flutter-Plugin插件的开发、发布、使用

在 package 里边把上传常见的问题都列举了出来,能够参阅:Flutter-Package插件的开发、发布、运用

欢迎重视、点赞及转发。