![08357200bcec902c0476ae54a5a5e87a.png](https://i-blog.csdnimg.cn/blog_migrate/d71f775f7664112e9fea3b738cab46f5.jpeg)
Flutter插件开发基础API
前言
这里的 Flutter 插件开发是基于安卓平台的,而且随着 Flutter 的版本更新,在 Flutter 1.12 开始 Flutter 团队调整了 Android 插件的实现代码,在 1.12 之后 Android 开始使用新的插件 API ,基于的旧的 PluginRegistry.Registrar 不会立即被弃用,但官方建议迁移到基于的新API FlutterPlugin ,另外新版本官方建议插件直接使用 Androidx 支持,官方提供的插件也已经全面升级到 Androidx
。所以这里开始的使用都是基于新版的API的。
而且因为笔者目前也在学习使用 Kotlin ,所以下面的代码都是基于 Kotlin 的实现的。
为了方便理解,笔者将结合正在写的使用 TFlite 的插件讲解。
插件类
在新 API 上 Android 插件需要使用 FlutterPlugin 和 MethodCallHandler 进行实现,同时还提供了 ActivityAware 用于 Activity
的生命周期管理和获取,提供 ServiceAware 用于 Service
的生命周期管理和获取。
也就是说我们的插件继承 io.flutter.embedding.engine.plugin
下的 FlutterPlugin
类以及 io.flutter.plugin.common.MethodChannel
下的 MethodCallHandler
类,如果需要用到 Activity
有需要继承 ActivityAware
接口。
以前的 Flutter 插件都是直接继承 MethodCallHandler
然后提供 registerWith
静态方法;这里还保留了 registerWith
静态方法,是因为还需要针对旧版本做兼容支持,同时新版 API 中 MethodCallHandler
将在 onAttachedToEngine
方法中被初始化和构建,在 onDetachedFromEngine
方法中释放;同时 Activity
相关的四个实现方法也提供了相应的操作逻辑。
class TflitePlugin : FlutterPlugin, MethodCallHandler {
private lateinit var channel: MethodChannel
// 为了兼容旧版本的API
companion object {
@JvmStatic
fun registerWith(registrar: Registrar) {
Log.v("registerWith", "registerWith")
val channel = MethodChannel(registrar.messenger(), "tflite")
channel.setMethodCallHandler(TflitePlugin())
}
}
// FlutterPlugin 的两个方法
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
this.channel = MethodChannel(flutterPluginBinding.flutterEngine.dartExecutor, "tflite")
this.channel.setMethodCallHandler(TflitePlugin())
}
override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
Log.v("onDetachedFromEngine", "onDetachedFromEngine")
}
}
响应来自的 Flutter 调用
我们要在我们的插件类中覆写 onMethodCall
方法,示例代码如下,其中 call
用于接收请求, result
用于返回结果,可以说是很容易理解的,一个 when
函数就可以解决。
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
when (call.method) {
"getPlatformVersion" -> {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
}
else -> {
result.notImplemented()
}
}
}