Flutter与原生交互

一、Flutter交互初始化

1、初始化Method Channel,定义交互名:message Method Channel

java 复制代码
static const methodChannel = MethodChannel('messageMethodChannel');

2、flutter发起原生调用

java 复制代码
methodChannel.invokeMethod(method, arguments);

其中method为调用原生函数对应key,arguments为传递数据,可多个任意类型值;同时返回值为Future,则可通过await或者then进行回调监听:

java 复制代码
HiChannel.invokeMethod(HiChannel.PERMISSION, {
'permissions': [HiPremissionKey.ACCESS_FINE_LOCATION]
}).then((value) {
  if (value) {
    homeIsLocation(() {
       eventBus.fire(UpdateDataEvent());
       yesCallback();
   }, noCallback);
  }
});

3、flutter监听原生调用

java 复制代码
methodChannel.setMethodCallHandler((call) {
  if (call.method == TOAST) {
    toast(call.arguments);
  } else if (call.method == SHOW_LOADING) {
    showLoading();
  } else if (call.method == HIDE_LOADING) {
    hideLoading();
  }
  return Future(() => "接受成功");
});

通过调用setMethodCallHandler监听原生调用,其中call.method为调用函数对应的key,call.arguments为传递数据,可为任意类型值。并原生可监听flutter的回调;

其中flutter回调通知原生,通过return Future(() => "接受成功");实现。

二、Android原生相关

1、Main Activity继承FlutterActivity类,并实现configureFlutterEngine函数:如下:

其中优先初始化调用监听:

java 复制代码
methodChannel = MethodChannel(
    flutterEngine.dartExecutor.binaryMessenger,
    "messageMethodChannel"
)

其中messageMethodChannel为flutter初始化时定义的交互名。

2、调用监听函数setMethodCallHandler,如下:

通过call.method判断调用方法。call.argument("error")获取flutter传递数值。调用完毕后,可通过result.success(value)进行回调flutter,其中value为任意类型值。

3、Android原生调用Flutter函数代码

调用invokeMethod函数实现。其中method为调用函数key,arguments为传递参数。并监听Result回调。通过success获取。

三、IOS原生相关

1、在application中初始化iOS通信

java 复制代码
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let channel = FlutterMethodChannel(name: "messageMethodChannel", binaryMessenger: controller.binaryMessenger)

2、调用监听函数setMethodCallHandler

java 复制代码
channel.setMethodCallHandler { (call:FlutterMethodCall, result:@escaping FlutterResult) in
    if (call.method == "sendData") {
       if let dict = call.arguments as? Dictionary<String, Any> {
           let name:String = dict["name"] as? String ?? ""
           let age:Int = dict["age"] as? Int ?? -1
          result(["name":"hello,\(name)","age":age])
      }
   }
}

其中call.method为调用函数key,call.arguments为传递参数值。并且通过result(value)进行回调,value为任意类型参数。

3、IOS原生主动向Flutter发送数据

java 复制代码
channel.invokeMethod(method, arguments:args)

👀关注公众号:Android老皮!!!欢迎大家来找我探讨交流👀

相关推荐
阳光予你39 分钟前
App 启动流程:从 Launcher 点击到 Activity 创建
android
小孔龙1 小时前
BufferQueue 对象交接与同步
android
XiaoLeisj1 小时前
Kotlin Flow 常用操作符:数据变换 map、filter、onEach,时间控制 debounce、sample,终端聚合 reduce、fold
android·kotlin·android jetpack·协程·响应式编程·flow
EQ-雪梨蛋花汤1 小时前
Android 3D 开发教程(三):Sceneform-EQR 配置 PBR 材质、光照、相机与实时阴影
android·3d·材质
Dovis(誓平步青云)2 小时前
《 固井工程软件 Cemsol 的数据管理与国产化适配实践》
android·java·开发语言·人工智能
Kapaseker2 小时前
小白都看得懂的 Skill 教程 - 创建第一个 Skill
android·kotlin·vibecoding
zhangphil2 小时前
Android BitmapFactory实现AOSP ContentResolver.loadThumbnail快速取小缩略图,Kotlin
android·kotlin
weixin_440784112 小时前
【OkHttp实现原理】
android·java·okhttp
恋猫de小郭2 小时前
Jetpack Compose 8 月版正式发布,核心模块 1.12
android·前端·flutter
delta_hell3 小时前
【阅读源码--Android】动画之AnimatorSet--1
android·源码·animatorset