一、Flutter 与 原生通信的三种基本方式以及使用场景
1.MethodChannel
主要是用于Flutter调用原生的方法(执行一个原生的行为更合适)
2.BasicMessageChannel
用于Flutter Native双向流式通信
3.EventChannel
主要用于Native平台单独向Flutter发送事件消息流,更强调单向用途,比如传感器事件监听
二、快速示例
1.MethodChannel 基本用法
以下示例在Flutter中调用一个native方法,这个方法叫做test,并且携带了一个String类型的参数
Dart端
dart
//第一步:创建MethodChannel对象,注意ID的唯一性
const nativeMethod = MethodChannel('com.test.method');
//第二步:执行方法调用,这里执行一个叫test 的 native的方法,并且传输了一个String类型的参数
var res= await nativeMethod.invokeMethod("test","Hello I am argument");
// res 就是原生的方法返回值
kotlin端
特别注意:
关于Native端的各种Channel初始化建议都放在
FlutterActivity#configureFlutterEngine
kotlin
//第一步:创建MethodChannel对象
var methodChanel=MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger,"com.test.method");
//第二步:设置Handler
methodChanel.setMethodCallHandler { call, result ->
run {
if (call.method == "test") {
//test方法回应
result.success("Hi your argument:"+call.arguments);
} else {
result.notImplemented()
}
}
}
2.BasicMessageChannel 的基本用法
Dart端
dart
//第一步:创建BasicMessageChannel对象并确定编解码器
BasicMessageChannel<String> basicMessageChannel = BasicMessageChannel("com.test.basic", StringCodec());
//第二步:发送消息(如果你需要)
void sendBasicMessage(String msg) {
basicMessageChannel.send(msg);
}
//第三步:设置消息Handhdler(接受到native的消息后,你需要做什么)
void setUpReceiveMessage(Function(dynamic content) callBackContent) {
basicMessageChannel.setMessageHandler((dynamic message) async {
// 处理收到的消息
print('Received message: $message');
callBackContent(message);
return 'Received!';
});
}
Kotlin端
kotlin
//第一步:初始化(在FlutterActivity#configureFlutterEngine方法中做)
//注意这里的id是com.test.basic必须和dart端保持一致
var basicMessageChannel = BasicMessageChannel(flutterEngine!!.dartExecutor.binaryMessenger, "com.test.basic", StringCodec.INSTANCE);
//第二步:设置Handler(当收到消息之后做什么)
basicMessageChannel.setMessageHandler { message, reply ->
run {
// 处理收到的消息
d(tag, "收到Flutter消息 " + message);
// 回复一个消息
reply.reply("Reply from Java: received");
sendMessage("Reply from Java: received");
}
}
//第三步:sendMessage(如果你又这个需要)
private fun sendMessage(message: String) {
basicMessageChannel.send(message) { reply: String? ->
// 处理Dart回复的消息
d("MainActivity", "Received reply: $reply")
}
}
3.EventChannel的基本用法
Dart 端
dart
///第一步 初始化EventChanel,注意这里的Channel Id需要和native保持一致
EventChannel eventChannel = EventChannel('com.test.event/channel');
// 第二步:注册监听(监听来自原生平台的数据流)
// 可以放在initState的方法中去做
void listenToNativeStream(Function(dynamic content) eventCallBack) {
eventChannel.receiveBroadcastStream().listen((dynamic event) {
// 处理原生平台发来的数据
print('Received event: $event');
eventCallBack("${event}");
}, onError: (dynamic error) {
// 处理错误
print('Received error: ${error.message}');
});
}
kotlin端
kotlin
//第一步:初始化(建议放在FlutterActivity#configureFlutterEngine方法中)
var eventChannel =EventChannel(flutterEngine!!.dartExecutor.binaryMessenger,"com.test.event/channel")
// 第二步:设置流处理器
eventChannel.setStreamHandler(object : EventChannel.StreamHandler {
//注意这里有个坑:arguments 类型必须是Any? 如果是Any可能会因为发生运行时错误
override fun onListen(arguments: Any?, events: EventSink) {
//第三步:保存EventSink以便之后发送事件
eventSink = events
// 你可以在这里开始发送事件,比如连接到一个传感器或其他数据源
}
override fun onCancel(arguments: Any) {
// 清理资源,停止发送事件
eventSink = null
}
})
//第四步:使用EventSink发送消息
private fun sendEventToFlutter(event: String) {
if (eventSink != null) {
eventSink!!.success(event)
}
}
Demo 地址