Flutter 与原生交互有三种方式:
BasicMessageChannel
也是双向交互,发送字符串和半结构化信息,有返回值
下面以Flutter
与原生iOS
交互为例看一下用法
Flutter
端
需要在Flutter
端创建一个channel
final basicMessageChannel = const BasicMessageChannel('test_basic_message_channel', StandardMessageCodec());
第一个参数是channel
的name
第二个参数是codec
/// The message codec used by this channel, not null.
final MessageCodec<T> codec;
它是MessageCodesc
类型
看源码注释,它是一个抽象类,是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
返回值的一个闭包
具体返回值打印信息如下:
发送消息
@objc func sendMessageToFlutter() {
channel.sendMessage("原生端主动发送给Flutter的消息") {(result) in
print(result!)
}
}
channel
通过sendMessage
发送消息,可以带上后面的闭包,result
为Flutter
端返回给原生端的消息
总结
- 发送消息:
sendMessage
- 接收消息:
setMessageHandler
- 都有返回值
- 可双向通信
- 原生端需要在主线程调用