flutter android 5.1.1版本打不开_Flutter插件开发基础API [Flutter Plugin 学习开发笔记(day1)]...

08357200bcec902c0476ae54a5a5e87a.png

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()
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值