天天看点

Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

原文地址: Flutter学习(9)——Flutter插件实现(Flutter调用Android原生) | Stars-One的杂货小窝

最近需要给一个Flutter项目加个apk完整性检测,需要去拿到当前安装apk的md5数值,由于Flutter中无法实现,需要调用原生Android代码才能实现,于是花了些时间研究了下插件的实现,特此记录

flutter中有个ios和android的文件夹,分别对应的Android和Ios的原生代码

Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

我们想要实现FLutter调用原生代码,在里面写原生代码即可

在android文件夹中,新建有个类,Android可以选择Java或者是Kotlin代码编写即可

android目录结构其实就是常见的Android项目目录

Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

然后使用Android Studio打开,右键菜单,选择<code>flutter</code> -&gt; <code>Open Android module in Android Studio</code>

Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

之后可以看到已经像Android开发一样打开了一个项目(当然,这里你也可以自己使用Android Studio去选择那个android文件夹,将其当做项目打开即可)

此Activity需要继承<code>FlutterActivity</code>,并重写<code>configureFlutterEngine</code>方法,在此方法中进行插件的初始化

那么这里需要插件的实例,插件的实例怎么来呢?其实就是自己写个类,然后实现Flutter提供的<code>FlutterPlugin</code>接口

新建一个类,实现<code>FlutterPlugin</code>接口,创建一个<code>MethodChannel</code>对象,利用此对象的<code>setMethodCallHandler</code>方法设置方法处理回调,里面通过判断方法名来调我们原生写的方法

如果你想要一个Application的context上下文对象,可以在<code>onAttachedToEngine()</code>方法中使用binding的<code>getApplicationContext()</code>方法获取,如下代码

如果是想要获取当前Activity的context对象,可以让当前类实现ActivityAware接口,不过略显繁琐,一般用Application的context对象应该可以满足大部分要求了,看情况选择吧

之前在第二步中的Activity中,补上注册的代码

在flutter中创建一个文件,文件名和class名任意,只是用来声明和初始化上述的Java类

还记得之前写的方法名的判断吗?这里就是传一个方法名,之后就会触发回调,之后即可得到返回结果

PS:注意,调Android原生的方法都是异步操作!

之后在对应的page文件对应代码处中调用即可

如果想使用同步代码,可以这样写

PS:测试的时候注意,如果是改了原生层代码(Java或Kotlin),最好将项目重新运行,不要使用Flutter的热重载功能(除非你只动了flutter的代码)

上述的例子中,并没有涉及到传参,这里再补充讲解下我自己的研究使用

这里只讲Flutter如何给Android原生传参

FLutter中调用方法(即上述的第五步操作):

Android中的接收(上述的第三步):

在判断方法名之后,即可通过对应的方法获取数据(需要类型转换)

上述的代码只是传单个数据,如果是要穿多个数据要怎么办呢?

由于<code>invokeMethod()</code>方法里只支持传单个数据,所以我们需要传map或是json格式的数据给到Android原生

Flutter发送数据:

Android接收数据:

这里有点要注意,call中有个arguments属性和arguments()方法,如下图

Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

flutter中传过来的数据是map或json的,就得用arguments()来获取参数据;否则就是使用arguments属性

当然,如果传过来的数据是map或json类型,call提供了一个方便快捷的方法,我们可以直接使用<code>argument(key)</code>来直接获取key对应的数值(注意这里也需要类型强转,注意类型需要对应)

最后这里给出Flutter与Java的对应的类型表:

Dart

Android

null

bool

java.lang.Boolean

int

java.lang.Integer

int, if 32 bits not enough

java.lang.Long

double

java.lang.Double

String

java.lang.String

Uint8List

byte[]

Int32List

int[]

Int64List

long[]

Float64List

double[]

List

java.util.ArrayList

Map

java.util.HashMap

点击查看源码(ApkMd5CheckPlugin类)

flutter plugin之路:flutter与原生交互传值OC/java版(一) - 简书

Flutter调用android原生方法_guanyueliuxing的博客-CSDN博客_flutter 调用原生方法

提问之前,请先看提问须知

点击右侧图标发起提问

Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

或者加入QQ群一起学习

Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

TornadoFx学习交流群:1071184701

Flutter学习(9)——Flutter插件实现(Flutter调用Android原生
Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

继续阅读