Flutter 与原生交互

2021-10-18  本文已影响0人  假若我年少有为不自卑

Flutter 与原生有四种消息传递的方案:

(1)MethodChannel:用于传递方法调用。

(2)EventChannel:用于数据流的通信;用于 flutter 和平台端进行事件监听、取消等。

(3)BasicMessageChannel:用于传递字符串和半结构化的信息;用于 flutter 和平台端进行消息数据交换时。

(4)路由传递的方式:初始化 FlutterEngine 可以传递一个路由字符串,在路由中可以拼接参数。

这里主要介绍一下 BasicMessageChannel 的使用,目前壁纸项目中使用的就是 BasicMessageChannel

原生和 Flutter 端约定通信 channel 名称为 flutter_message_handler,两端传递消息格式使用 json String

下面是两端相互调用的参数约定:

原生 => Flutter

请求参数:

参数名 参数类型 参数说明
method Sring 方法名称(通过不同的方法名来区分不同的交互)
content Sring 附带参数(json String)

回调参数:(大部分交互可不关心回调)

参数名 参数类型 参数说明
code Sring 执行错误码,1 代表成功
content Sring 附带参数(json String)
message Sring 回调信息文言

Flutter => 原生

请求参数:

参数名 参数类型 参数说明
method Sring 方法名称(通过不同的方法名来区分不同的交互)
content Sring 附带参数(json String)

回调参数:(大部分交互可不关心回调)

参数名 参数类型 参数说明
code Sring 执行错误码,1 代表成功
content Sring 附带参数(json String)
message Sring 回调信息文言

android 代码:

android 端创建 BasicMessageChannel 需要传递 3 个参数。第 1 个是 BinaryMessenger 接口,代表消息信使,是消息发送与接收的工具;第 2 个参数是 name,表示 Channel 的名称,定义了 final 类型保证唯一,第 3 个参数是 MessageCodec,表示编码方式,默认是 UTF8 编码。

    private fun setupFlutter() {
        flutterEngine = FlutterEngine(this)
        flutterEngine.dartExecutor.executeDartEntrypoint(
            DartExecutor.DartEntrypoint.createDefault()
        )
        FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine)

        val flutterActivity = FlutterActivity
            .withCachedEngine("my_engine_id").build(this)
        val messageChannel = BasicMessageChannel(flutterEngine.dartExecutor.binaryMessenger, "flutter_message_handler", StringCodec.INSTANCE)

        // 接收消息
        messageChannel.setMessageHandler { message, reply -> handleMessage(message, reply) }
        // 发送消息
        messageChannel.send("xxxx")
    }

    private fun handleMessage(message: String?, replay:  BasicMessageChannel.Reply<String>) {
        println(message)
    }

iOS 代码:

iOS 端创建 FlutterBasicMessageChannel 需要传两个参数,一个是 channelname,另一个 binaryMessenger 是代表消息信使,是消息发送与接收的工具;

    self.flutterEngine = [[FlutterEngine alloc] initWithName:@"io.flutter" project:nil];    
    [self.flutterEngine runWithEntrypoint:nil];
    // 该方法要放到 runWithEntrypoint 之后
    [GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine];
    _flutterVC = [[KWFlutterViewController alloc] initWithEngine:self.flutterEngine nibName:nil bundle:nil];
    // Channel 初始化,channel 名称为 flutter_message_handler
    _messageChannel =
    [FlutterBasicMessageChannel messageChannelWithName:@"flutter_message_handler"
                                       binaryMessenger:_flutterVC];
    
    // 接收消息监听
    [_messageChannel setMessageHandler:^(id message, FlutterReply callback) {
        
    }];

    // 发送消息
    [_messageChannel sendMessage:@{@"method": @"onResume"} reply:^(id  _Nullable reply) {
        
    }];

Flutter 端代码:

// 创建 BasicMessageChannel 实例,设置 channel 名字为 flutter_message_handler,与原生设置的一致;
static const BasicMessageChannel messageChannel = const BasicMessageChannel('flutter_message_handler', StandardMessageCodec());

// 接收消息
messageChannel.setMessageHandler((message) async {
    Map<String, String> response = {};
    response["code"] = "1";
    response["content"] = "";
    response["message"] = "flutter 接收到数据";
    // 给原生回调
    return response;
});

// 发送消息
Future<dynamic> sendMessage(String method, Map? content) async {
    var arguments = {"method": method};
    if (null != content) {
      String jsonStr = convert.jsonEncode(content);
      arguments["content"] = jsonStr;
    }
    return messageChannel.send(arguments);
}
上一篇下一篇

猜你喜欢

热点阅读