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
需要传两个参数,一个是 channel
的 name
,另一个 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);
}
网友评论