SuperAPI AI 工具集

flutter-plugins

编程与开发

查看项目

更新于 10-15 15:27

技能介绍

用途

flutter-plugins 是一个 Flutter 插件生成技能(flutter-plugin-generator),目标是脚手架化(scaffold)并配置 Flutter 插件包,让其他 Flutter 应用可以通过该插件调用原生能力。它处理标准 Method Channel、FFI 集成以及联邦插件(federated plugin)架构,并配置各平台专属的原生代码环境、实现 Android v2 embedding 生命周期接口、建立平台接口包。

架构决策逻辑

技能依据以下决策树来确定插件架构与模板:

  1. 插件是否需要通过 dart:ffi 使用 C/C++ 原生代码?
    • 是:使用 --template=plugin_ffi。注意:FFI 插件支持打包原生代码和方法通道注册,但不支持方法通道本身。
    • 否:进入第 2 步。
  2. 插件是否同时需要 dart:ffi 和 Method Channels?
    • 是:使用 --template=plugin(非 FFI)。必须在标准插件结构内手动配置 FFI。
    • 否:进入第 3 步。
  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 生命周期规范的插件开发。

暂未提供

关于本技能的具体收费、价格、版本号、支持范围之外的平台信息,资料中暂未提供。