Channel实现Flutter与原生平台之间的双向通信


首先,现在Android中进行注册与初始化:

    private void registerChannelFunction() {
        FlutterEngine flutterEngine = getFlutterEngine();
        if (flutterEngine == null) {
            Log.e("ERROR", "注册消息通道失败 FlutterEngine = null");
            return;
        }

        DartExecutor dartExecutor = flutterEngine.getDartExecutor();
        binaryMessenger = dartExecutor.getBinaryMessenger();
        messageChannelSendFunction();
        methodChannelSendFunction();
        eventChannelSendFunction();

    }

(一)通过MessageChannel实现Flutter与原生平台之间的双向通信

Flutter端实现MessageChannel通信步骤:

先定义messageChannel

static const basicMethodChannel = 
BasicMessageChannel("flutter_basic_method_channel", StandardMessageCodec());

发送message:

  Future<void> sendMessage(Map json) async {
    await basicMethodChannel.send(json);
  }

接收message:

  void receiveMessage() {
    basicMethodChannel.setMessageHandler((result) async {
        Map? map = result as Map?;
        int code = map?["code"];
        String message=map?["message"];
        setState(() {
          receive = "messageChannel receiveMessage 中的回调 code $code  message $message";
          print(receive);
          print("receiveMessage: code:$code message:$message");
        });
        return 'Flutter 已收到消息';

    });
  }

Android端实现MessageChannel通信步骤:

首先,先初始化 BasicMessageChannel 实例对象:

basicMessageChannel = new BasicMessageChannel<>(binaryMessenger, 
"flutter_basic_method_channel", StandardMessageCodec.INSTANCE);

然后为Message对象设置MessageHandler对象:

        basicMessageChannel.setMessageHandler(new BasicMessageChannel.MessageHandler() {
            @Override
            public void onMessage(@Nullable Object message, @NonNull BasicMessageChannel.Reply reply) {
                System.out.println("flutter 传来的数据为: "+message.toString());
                basicSendMessage();
            }
        });

(二)通过MethodChannel实现Flutter与原生平台之间的双向通信

Flutter端实现MessageChannel通信步骤:

定义methodChannel:

static const methodChannel = MethodChannel("flutter_method_channel");

然后通过methodChannel的invokeMethod进行消息的发送:

  static Future<dynamic> invokeNative(String method,
      {required Map<String, String> arguments}) async {
    if (arguments == null) {
      return await methodChannel.invokeMethod(method);
    } else {
      return await methodChannel.invokeMethod(method, arguments);
    }
  }

最后调用会返回一个结果,通过这个result拿到返回的数据:

    Map result = await invokeNative("test", arguments: {});
    int code = result["code"];
    String message = result["message"];
    setState(() {
      receive = "invokeNative 中的回调 code $code message $message";
      print(receive);
    });

Android端实现MessageChannel通信步骤:

先初始化MethodChannel的实例:

        mMethodChannel = new MethodChannel(binaryMessenger, channelName);

然后设置methodHandler,它会重写MethodCallHandler的onMethodCall方法:

    private MethodChannel.MethodCallHandler getMethodCallHandler() {
        return new MethodChannel.MethodCallHandler() {
            @Override
            public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
                String method = call.method;
                Object Arguments = call.arguments;
                Map<String, Object> arguments = null;

                if (null != Arguments) {
                    arguments = (Map<String, Object>) Arguments;
                }

                if ("test".equals(method)) {
                    Toast.makeText(this, "flutter 调用到了 android test 数据为 name :"+arguments.get("name") +" age : "+arguments.get("age"), Toast.LENGTH_SHORT).show();

                    Map<String, Object> objectMap = new HashMap<>();
                    objectMap.put("message", "result.success 返回给flutter的basic数据");
                    objectMap.put("code", 300);
                    result.success(objectMap);
                } else {
                    result.notImplemented();
                }
            }
        };
    }

(三)通过EventChannel实现Flutter与原生平台之间的双向通信

Flutter端实现EventChannel通信步骤:

首先 初始化EventChannel实例:

static const eventChannel = EventChannel("flutter_event_channel");

然后设置Stream:

    eventChannel.receiveBroadcastStream().listen((event) {
      // int code = event["code"];
      // String message = event["message"];
      setState(() {
        // receive += "code $code message $message  ";
        // print("eventMessageListener: "+receive);
        print(event);
      });
    }, onError: (event) {});

Android端实现EventChannel通信步骤:

初始化EventChannel:

String channelName = "flutter_event_channel";
EventChannel eventChannel = new EventChannel(binaryMessenger, channelName);

然后调用setStreamHandler为EventChannel设置一个处理器:

        eventChannel.setStreamHandler(new EventChannel.StreamHandler() {
            @Override
            public void onListen(Object arguments, EventChannel.EventSink events) {
                eventSink = events;
                startTimer();
            }

            @Override
            public void onCancel(Object arguments) {

            }
        });

EventSink 接口中 , 有 3 个方法 :

  • success : 表示接收数据成功 ;
  • error : 表示接收数据出现错误 ;
  • endOfStream : 表示接收数据结束 ;

这样就完成了Flutter与Android原生之间的通信,IOS的不太熟,有需要可以搜一下,都大差不差,如果觉得博主写的对你有帮助,麻烦给个一键三连

相关推荐

  1. Channel实现Flutter原生平台之间双向通信

    2024-05-11 01:24:03       9 阅读
  2. PythonC#之间双向管道连接-发送数据

    2024-05-11 01:24:03       12 阅读
  3. Go实现简单协程池(通过channel实现

    2024-05-11 01:24:03       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-11 01:24:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-11 01:24:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-11 01:24:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-11 01:24:03       20 阅读

热门阅读

  1. 达梦数据库常用命令整理

    2024-05-11 01:24:03       6 阅读
  2. Android 11.0 mtk平台系统添加公共so库的配置方法

    2024-05-11 01:24:03       9 阅读
  3. VUE中可适化大屏的自适应

    2024-05-11 01:24:03       7 阅读
  4. 飞天使-k8s知识点29-kubernetes安装1.28.0版本

    2024-05-11 01:24:03       10 阅读
  5. 第 7 章 MyBatis 缓存配置

    2024-05-11 01:24:03       9 阅读
  6. 自动选择图表类型:基于数据特征智能决策

    2024-05-11 01:24:03       11 阅读
  7. 【CV】计算机视觉中的特征追踪与背景处理

    2024-05-11 01:24:03       11 阅读
  8. 机器学习-如何为模型选择评估指标?

    2024-05-11 01:24:03       9 阅读