用途
flutter-plugins 是一个 Flutter 插件生成技能(flutter-plugin-generator),目标是脚手架化(scaffold)并配置 Flutter 插件包,让其他 Flutter 应用可以通过该插件调用原生能力。它处理标准 Method Channel、FFI 集成以及联邦插件(federated plugin)架构,并配置各平台专属的原生代码环境、实现 Android v2 embedding 生命周期接口、建立平台接口包。
架构决策逻辑
技能依据以下决策树来确定插件架构与模板:
- 插件是否需要通过 dart:ffi 使用 C/C++ 原生代码?
- 是:使用 --template=plugin_ffi。注意:FFI 插件支持打包原生代码和方法通道注册,但不支持方法通道本身。
- 否:进入第 2 步。
- 插件是否同时需要 dart:ffi 和 Method Channels?
- 是:使用 --template=plugin(非 FFI)。必须在标准插件结构内手动配置 FFI。
- 否:进入第 3 步。
- 插件是否由多个团队开发,或需要高度解耦的平台实现?
- 是:实现 Package-Separated Federated Plugin(面向应用的包、平台接口包、平台实现包)。
- 否:实现标准的单体插件(monolithic plugin)。
使用方式
收集插件需求
技能会先向用户询问:插件名称;组织名称(反向域名表示法,例如 com.example);需要支持的平台(逗号分隔:android、ios、web、linux、macos、windows);需要 FFI 插件还是标准 Method Channel 插件;Android 使用 Java 还是 Kotlin、iOS 使用 Objective-C 还是 Swift;是否应为联邦插件。
生成插件包
基于用户参数执行 Flutter CLI 命令。标准插件示例:
flutter create --org com.example --template=plugin --platforms=android,ios,macos -a kotlin -i swift my_plugin
FFI 插件示例:
flutter create --template=plugin_ffi my_ffi_plugin
配置联邦插件架构(如适用)
若用户要求联邦插件,需要在面向应用的包的 pubspec.yaml 中 endorse 各平台实现:
# App-facing pubspec.yaml
flutter:
plugin:
platforms:
android:
default_package: my_plugin_android
windows:
default_package: my_plugin_windows
dependencies:
my_plugin_android: ^1.0.0
my_plugin_windows: ^1.0.0
各平台实现包中定义 implements 键:
# Platform implementation pubspec.yaml (e.g., my_plugin_windows)
flutter:
plugin:
implements: my_plugin
platforms:
windows:
pluginClass: MyPlugin
准备原生代码编辑环境
在修改原生代码前,必须先构建示例应用以解析依赖并生成必要文件:
cd my_plugin/example
flutter build apk --config-only # For Android
flutter build ios --no-codesign --config-only # For iOS
flutter build windows # For Windows
实现 Android v2 Embedding 生命周期
修改 Android 插件类(例如 android/src/main/kotlin/com/example/my_plugin/MyPlugin.kt)。将 registerWith() 中的逻辑抽取为与 onAttachedToEngine() 共享的私有方法。如需要上下文,实现 ActivityAware 或 ServiceAware。示例代码:
package com.example.my_plugin
import androidx.annotation.NonNull
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
class MyPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
private lateinit var channel : MethodChannel
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
setupChannel(flutterPluginBinding.binaryMessenger)
}
// Shared private method for v1 and v2 embedding compatibility
private fun setupChannel(messenger: BinaryMessenger) {
channel = MethodChannel(messenger, "my_plugin")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
if (call.method == "getPlatformVersion") {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
} else {
result.notImplemented()
}
}
override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
// Handle Activity attachment
}
override fun onDetachedFromActivityForConfigChanges() {}
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {}
override fun onDetachedFromActivity() {}
}
验证与修复
运行插件测试与分析器,确保生成的代码有效:
cd my_plugin
flutter analyze
flutter test
如果分析器报告缺少依赖或无法解析原生符号,需确认第 4 步(构建示例应用)已成功执行,并修复原生代码块中缺失的 import。
约束与限制
- 绝不能在 --template=plugin_ffi 创建的包中使用 Method Channels。如果两者都需要,请使用 --template=plugin。
- 在尝试编辑或分析原生 Android(build.gradle)、iOS(.xcworkspace)或 Windows(.sln)文件之前,必须至少构建一次示例项目(flutter build <platform>)。
- 不得在 Dart API(lib/<package_name>.dart)中留下未编写文档的公开成员。
- 必须始终使用 v2 Android embedding(FlutterPlugin),不要仅依赖已弃用的 PluginRegistry.Registrar。
- 绝不要编辑 Flutter module 内的 .android 或 .ios 目录;只编辑插件自身 android/ 或 ios/ 目录中的原生代码。
适用场景
适用于需要为 Flutter 应用创建原生互操作插件的开发者,尤其是涉及标准 Method Channel、dart:ffi 原生代码或联邦插件架构的场景,以及需要遵循 Android v2 embedding 生命周期规范的插件开发。
暂未提供
关于本技能的具体收费、价格、版本号、支持范围之外的平台信息,资料中暂未提供。