一、Flutter 与 原生通信的三种基本方式以及使用场景
1.MethodChannel
主要是用于Flutter调用原生的方法(执行一个原生的行为更合适)
2.BasicMessageChannel
用于Flutter Native双向流式通信
3.EventChannel
主要用于Native平台单独向Flutter发送事件消息流,更强调单向用途,比如传感器事件监听
二、快速示例
1.MethodChannel 基本用法
以下示例在Flutter中调用一个native方法,这个方法叫做test,并且携带了一个String类型的参数
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
//第一步:创建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端
//第一步:创建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端
//第一步:初始化(在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 端
///第一步 初始化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端
//第一步:初始化(建议放在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 地址
https://gitee.com/wangzy2018/flutter-android-combine.git