上一篇文章写了flutter和Android原生交互的三种方式 今天再加上通过plugin和Android原生交互的方法
首先 创建一个flutter插件
这里选择创建plugin 然后我们命名就叫my_plugin 创建完成之后插件目录是这样的
其中example是一个官方示例 我们这里自己写 所以这里用不上 直接删除 删除后将插件通过本地导入的方式导入到我们的flutter项目 这里我将插件复制到flutter项目的根目录(放在哪里都可以)
现在我的flutter项目的结果如下
然后再pubspec.yaml中引入这个插件
这样我们就把插件引入flutter项目了 然后我们用Android Studio打开插件中的Android项目
打开后你会发现 你的TestPlugin代码会飘红
这个时候你打开build.gradle 然后再Android{}内添加
//获取local.properties配置文件 def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } //获取flutter的sdk路径 def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } dependencies { testImplementation 'org.jetbrains.kotlin:kotlin-test' testImplementation 'org.mockito:mockito-core:5.0.0' compileOnly files("$flutterRoot/bin/cache/artifacts/engine/android-arm/flutter.jar") }
然后重新编译一下 你会发现 飘红的问题已经解决了 好了 到现在为止 准备工作就好了
然后我们开打插件的lib目录 你能看到三个文件
其中test_plugin中写的方法给flutter中调用 我们这里写一个调用方法
对应的另外俩个文件中添加同样的方法
这里的参数tag 就是我们从flutter传递到Android原生的参数
然后再插件的Android目录下 我们打开TestPlugin 这是自动生成的 其中的onMethodCall方法中就是处理flutter调用的方法
然后在我们flutter项目的lib目录下 定义一个方法_getAndroidValue来调用插件的方法
我们点击按钮 显示结果
这样简单的交互就完成了
现在进阶一下 模拟一个场景 比如从flutter页面点击登录跳转到Android原生页面 然后登录完成后携带返回值到flutter
首先定义一个方法
点击事件中调用 然后再插件的lib目录下的三个方法中分别 添加方法
然后在TestPlugin 中添加对应的方法 要注意的是 这里跳转到页面需要context 这里有俩种方法可以获取到context
第一种是在onAttachedToEngine方法中通过flutterPluginBinding.applicationContext 获取到全局的context 第二种是实现ActivityAware接口 然后在实现的方法中获取到activity 具体如下
第一种
第二种
回到onMethodCall方法 我们接收到flutter调用的方法 然后携带传递的值跳转到LoginActivity
如果你需要在LoginActivity 处理完延迟消息后 才返回flutter的话 这里我们定义一个resultMethod 在onMethodCall方法中赋值
在onDetachedFromEngine方法中清空
这样在LoginActivity中 我们模拟一下 点击后返回flutter
运行结果如下
默认页面
点击跳转到LoginActivity
点击login按钮 返回flutter
这样就实现了通过插件 flutter和Android原生交互了
记录一下