Flutter与原生交互方式之BasicMessageChannel使用

792 阅读2分钟

Flutter 与原生交互有三种方式:

MethodChannel使用

EventChannel使用

BasicMessageChannel 也是双向交互,发送字符串和半结构化信息,有返回值

下面以Flutter与原生iOS交互为例看一下用法

Flutter

需要在Flutter端创建一个channel

final basicMessageChannel = const BasicMessageChannel('test_basic_message_channel', StandardMessageCodec());

第一个参数是channelname

第二个参数是codec

/// The message codec used by this channel, not null.
final MessageCodec<T> codec;

它是MessageCodesc类型

截屏2023-08-17 09.39.39.png

看源码注释,它是一个抽象类,是message的编码和解码机制,这里只需要使用系统默认的标准方式 StandardMessageCodec即可

class StandardMessageCodec implements MessageCodec<Object?>

StandardMessageCodec实现了抽象类 MessageCodec,具体可以看源码

发送消息
Future<void> sendMessageFromBasicMessageChannel() async {
  final result = await basicMessageChannel.send('我是Flutter主动传递给原生的消息');
  print(result);

给原生端发送消息采用send方式

/// Sends the specified [message] to the platform plugins on this channel.
///
/// Returns a [Future] which completes to the received response, which may
/// be null.
Future<T?> send(T message) async {
  return codec.decodeMessage(await binaryMessenger.send(name, codec.encodeMessage(message)));
}

send方法返回值是一个Future,类型是泛型,所以可以通过await获取原生端返回给Flutter的值,下面在原生端会体现。

接收消息

Future<void> setBasicMessageChannelCallHandler() async {
  basicMessageChannel.setMessageHandler((message) async {
    print('Flutter收到了原生端的消息:$message');
    return Future.value('我是Flutter回传给原生的消息');
  });
}

设置接收原生端的消息回调

void setMessageHandler(Future<T> Function(T? message)? handler) {
  if (handler == null) {
    binaryMessenger.setMessageHandler(name, null);
  } else {
    binaryMessenger.setMessageHandler(name, (ByteData? message) async {
      return codec.encodeMessage(await handler(codec.decodeMessage(message)));
    });
  }
}

回调中也可以给原生端返回值,返回值也是个Future

iOS原生端

定义一个BasicMessageChannelManager管理类,在入口函数中初始化:

let messager = window.rootViewController as! FlutterBinaryMessenger
BasicMessageChannelManager(messager: messager)
接收消息
class BasicMessageChannelManager {
    var channel: FlutterBasicMessageChannel
    init(messager: FlutterBinaryMessenger) {
        channel = FlutterBasicMessageChannel(name: "test_basic_message_channel", binaryMessenger: messager)
        channel.setMessageHandler { (message, reply) in
            print("原生端收到了来自Flutter端的消息\(message!)")
            reply("原生端返回给Flutter端的消息")
        }
    }
}

在初始化方法中初始化 channel,并配置channel方法监听,message表示Flutter端发送过来的消息,reply是原生端给Flutter返回值的一个闭包

具体返回值打印信息如下:

截屏2023-08-17 09.50.00.png

发送消息
@objc func sendMessageToFlutter() {
      channel.sendMessage("原生端主动发送给Flutter的消息") {(result) in
         print(result!)
     }
 }

channel通过sendMessage发送消息,可以带上后面的闭包,resultFlutter端返回给原生端的消息

截屏2023-08-17 09.51.49.png

总结

  • 发送消息: sendMessage
  • 接收消息:setMessageHandler
  • 都有返回值
  • 可双向通信
  • 原生端需要在主线程调用