免费建站长平台网站,wordpress 后台主题不显示,网站建站素材,南宁网站seo一、Flutter 与 原生通信的三种基本方式以及使用场景
1.MethodChannel
主要是用于Flutter调用原生的方法(执行一个原生的行为更合适)
2.BasicMessageChannel
用于Flutter Native双向流式通信
3.EventChannel
主要用于Native平台单独向Flutter发送事件消息流,更强调单向用…一、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 methodChanelMethodChannel(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对象并确定编解码器
BasicMessageChannelString 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