美文网首页
Flutter 与原生交互

Flutter 与原生交互

作者: 假若我年少有为不自卑 | 来源:发表于2021-10-18 09:58 被阅读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);
    }
    

    相关文章

      网友评论

          本文标题:Flutter 与原生交互

          本文链接:https://www.haomeiwen.com/subject/aoggoltx.html