Flutter与Native通信(三)BasicMessageChannel

flutter可以native之间可以通过Platform Channels APIs进行通信,API主要有以下三种:

BasicMessageChannel用于在flutter和native互相发送消息,一方给另一方发送消息,收到消息之后给出回复。照例我们先看一下API的基本使用流程,然后再看代码实现

1.BasicMessageChannel的基本流程

flutter向native发送消息

  1. [flutter]创建BasicMessageChannel
  2. [native]通过BasicMessageChannel#MessageHandler注册Handler
  3. [flutter]通过BasicMessageChannel#send发送消息
  4. [native]BasicMessageChannel#MessageHandler#onMessage中接收消息,然后reply

native向flutter发送消息

流程也是一样的,只是将[flutter]与[native]反调

2.代码实现

flutter端

flutter需要完成以下工作

  • 创建BasicMessageChannel
  • 通过BasicMessageChannel#send发送消息

相对与其他Channel类型的创建,MessageChannel的创建除了channel名以外,还需要指定编码方式:

BasicMessageChannel(String name, MessageCodec<T> codec, {BinaryMessenger binaryMessenger})

发送的消息会以二进制的形式进行处理,所以要针对不同类型的数进行二进制编码

编码类型消息格式
BinaryCodec发送二进制消息时
JSONMessageCodec发送Json格式消息时
StandardMessageCodec发送基本型数据时
StringCodec发送String类型消息时

 

 

 

 

 

 

class _MyHomePageState extends State<MyHomePage> {
  static const _channel = BasicMessageChannel('com.example.messagechannel/interop', StringCodec());

  String _platformMessage;

  void _sendMessage() async {
    final String reply = await _channel.send('Hello World form Dart');
    print(reply);
  }

  @override
  initState() {
    super.initState();

    // Receive messages from platform
    _channel.setMessageHandler((String message) async {
      print('Received message = $message');
      setState(() => _platformMessage = message);
      return 'Reply from Dart';
    });

    // Send message to platform
    _sendMessage();
  }

native(android)端

  • android端完成以下工作:
  • 创建BasicMessageChannel
  • 通过setHandler注册MessageHandler
  • MessageHandler#onMessage回调中接收到message后,通过reply进行回复
class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)

        val channel = BasicMessageChannel(
                flutterEngine.dartExecutor.binaryMessenger,
                "com.example.messagechannel/interop",
                StringCodec.INSTANCE)

        // Receive messages from Dart
        channel.setMessageHandler { message, reply ->
            Log.d("Android", "Received message = $message")
            reply.reply("Reply from Android")
        }

        // Send message to Dart
        Handler().postDelayed({
            channel.send("Hello World from Android") { reply ->
                Log.d("Android", "$reply")
            }
        }, 500)
    }
}

Andorid端回复的消息会在Flutter端显示

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fundroid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值