. 学习flutter与android相互调用后记录一下,希望对大家有所帮助。 flutter有三种channel用来与原生代码交互,篇中主要通过MethodChannel 实现。
1. 首先准备一下工作,因为我们要在MainActivity重写configureFlutterEngine(),直接在MainActivity 中的是无法重写的,会爆红出现Cannot find declaration to go to,以下是解决步骤
1.1,找到android目录下的MainActivity,可能FlutterActivity会爆红,可以根据下图中步骤解决
1.2,点击红色部分 另启一个视图
1.3,接下来我们只需要在新启开的视图MainActivity中重写configureFlutterEngine(),并且你在这个视图写的代码,会同时更新到flutter下的MainActivity中
以上准备工作已完成。
2 . flutter 调用 android
2.1 接下来先在android端实现MethodChannel ,并调用setMethodCallHandler设置回调,以下完整代码
<code>
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
//同步更新
//创建一个channel对象
val channel = "com.rk.flutter.connection"
val methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channel)
//设置回调 ,会根据不同的方法名进行不同的处理
methodChannel.setMethodCallHandler { call, result ->
when (call.method) {
"flutter.invoke/android" -> {
// 获取flutter传入的参数
val msg = call.argument<String>("msg")
Log.i("wwb", "正在执行原生方法,传入的参数是:「$msg」")
// 通知执行成功
result.success(getMsg())
}
else -> {
result.notImplemented()
}
}
}
}
private fun getMsg(): String {
return "flutter 调用android 成功"
}
</code>
2.2 然后在flutter端 创建相同的channel,调用invokeMethod()就成功了,以下完整代码
<code>
//定义渠道
const methodChannel = const MethodChannel('com.demo.flutter.connection');
//定义方法名及传入android参数配置并接收返回的原生返回的结果
methodChannel.invokeMethod('flutter.invoke/android', {"msg":'wwb'});
</code>
以上就完成了flutter调用android。
3,android 调用flutter
3.1 flutter 完整代码
<code>
void _initChannel() {
//定义一个channel
const channel =const MethodChannel('com.rk.flutter.connection');
channel.setMethodCallHandler((call) {
switch (call.method) {
//方法名
case 'android.invoke/flutter':
//接收android调用flutter方法的参数
String msg = call.arguments['msg'];
print("原生 调用 Flutter 成功,参数是:$msg");
break;
}
return null;
});
}
</code>
3.2 android 完整代码 这部分代码也在configureFlutterEngine()中
<code>
//android 传参给flutter
val params = mapOf("msg" to "这是来自 Android 端的参数")
// 调用 Flutter 中的方法
methodChannel.invokeMethod("android.invoke/flutter", params)
</code>
好了,以上就是flutter与android之间相互调用。