在中国做采购在哪个网站找产品,网页功能设计,如何给网站做高质量外链,wordpress添加用户前言
上一篇博客主要介绍了MethodChannel的使用方式 Flutter与Native通信的方式#xff1a;MethodChannel 这篇博客接着讲另外两种通信方式 EventChannel和BasicMessageChannel
EventChannel用于从native向flutter发送通知事件#xff0c;例如flutter通过其监听Android的重…前言
上一篇博客主要介绍了MethodChannel的使用方式 Flutter与Native通信的方式MethodChannel 这篇博客接着讲另外两种通信方式 EventChannel和BasicMessageChannel
EventChannel用于从native向flutter发送通知事件例如flutter通过其监听Android的重力感应变化等。与MethodChannel不同EventChannel是native到flutter的单向调用调用是多播一对多的可以类比成Android的Brodcast。
BasicMessageChannel用于在flutter和native互相发送消息一方给另一方发送消息收到消息之后给出回复。它和MethodChannel的区别重在一个消息的回复
EventChannel
Android端调用Flutter端
首先是Flutter端代码创建一个EventChannel并约定好字段
static const EventChannel _channel EventChannel(tofluttereventchannel);然后写好被调用的方法 void _enableEventReceiver() {//延时3s先让 Android 端的 EventChannel 进行初始化 , 然后在 Flutter 端注册 EventChannel 监听//这样才能确保连接成功Future.delayed(const Duration(milliseconds: 5000), () {_streamSubscription _channel.receiveBroadcastStream().listen((dynamic event) {print(收到消息 event: $event);setState(() {mMessage event;});}, onError: (dynamic error) {print(出现错误 error: ${error.message});setState(() {errmMessage error.message;});});});}_enableEventReceiver方法可以放到Widget的initState()中初始化 在dispose()中调用以下取消监听的方法 void _disableEventReceiver() {if (_streamSubscription ! null) {print(flutter断开连接);//断开连接这里也会触发android端的onCancel方法_streamSubscription?.cancel();_streamSubscription null;}}然后来到Android端定义两个对象 一个是EventChannel一个是EventSink private lateinit var channel: EventChannelvar eventSink: EventChannel.EventSink? null继续在configureFlutterEngine方法中做处理 channel EventChannel(flutterEngine.dartExecutor, tofluttereventchannel)channel.setStreamHandler(object : EventChannel.StreamHandler {override fun onListen(arguments: Any?, events: EventChannel.EventSink) {Log.d(MyFlutterActivity, 已建立连接)eventSink events}override fun onCancel(arguments: Any?) {Log.d(MyFlutterActivity, 已断开连接)}})可以看到其实就是在建立连接后对EventSink对象进行赋值 当eventSink 赋值后就可以拿他进行消息的发送了 比如 override fun onResume() {super.onResume()//这里延时执行是为了模拟eventSink初始化后我们在业务里面进行消息的发送Handler().postDelayed({eventSink?.success(这是来自安卓的消息)//执行了endOfStream后再发送消息就无效了所以这行代码要放到endOfStream上面执行eventSink?.error(error code, 这是来自安卓的错误消息, error details)//结束通信这时候onCancel会被调用eventSink?.endOfStream()}, 6000)}这样EventChannel的使用就介绍完了
注意
在实际运行时可能会发现不起作用 归根结底是注册和调用顺序问题 所以最好在Flutter先延迟一下注册监听 让 Android 端的 EventChannel 先建立连接, 然后在 Flutter 端注册 EventChannel 监听 这样才能确保连接成功 所以用 Future.delayed 进行延时操作 具体可以参考这篇博客 Flutter 混合开发报错
MessageChannel
MessageChannel重在回调后的消息回复 相对与其他Channel类型的创建MessageChannel的创建除了channel名以外还需要指定编码方式。 因为发送的消息会以二进制的形式进行处理所以要针对不同类型的数进行二进制编码 主要方式有 下面看具体使用
Flutter端
Flutter端首先定义BasicMessageChannel static const messageChannel BasicMessageChannel(tofluttemessagechannel, StringCodec());发送消息这样写 ///发送MessageChannel消息延时一下确保安卓端先注册了监听才能收到void _sendMessage() {Future.delayed(const Duration(milliseconds: 6000), () async {final String? result await messageChannel.send(来自flutter主动发送的消息);print(收到安卓端的返回值${result});});}可以看到发送后会拿到返回值result
注册回调也就是接受消息这样写 //注册MessageChannel消息监听messageChannel.setMessageHandler((message) async {print(收到安卓端的MessageChannel消息 $message);setState(() {forNativeMsg message ?? ;});return 来自flutter返回的消息;});//发送MessageChannel消息可以看到接收到后也会给到Android端一个返回值 利用BasicMessageChannel我们就很快的完成了消息的发送和接收 并且每一个操作都可以接受或者传送返回值
Android端
Android端其实和Flutter端几乎一样 首先是定义BasicMessageChannel //先注册MessageChannelval messageChannel BasicMessageChannel(flutterEngine.dartExecutor,tofluttemessagechannel,StringCodec.INSTANCE)发送消息 //发送消息Handler().postDelayed({messageChannel.send(来自安卓端主动发送的消息) { result -Log.d(MyFlutterActivity, 收到flutter端的返回值:$result)}}, 500)注册回调也就是接受消息 //先注册监听messageChannel.setMessageHandler { message, reply -Log.d(MyFlutterActivity, 收到flutter端的MessageChannel消息message)reply.reply(来自安卓端返回的消息)}注意
这里其实也要注意一个顺序问题 总结起来就是先注册后发送 先让被回调的那一端注册监听完成后 再去跨端调用也就是发送消息
总结
最后来总结一下三种方式的区别
通信方式双端通信指定编码注册顺序使用场景MethodChannel支持否不需要延时注册方法调用EventChannelNative单向调用Flutter否先建立连接再监听广播通知BasicMessageChannel支持是先注册再监听用于传递字符串和半结构化的消息
源码
源码地址 EventChannel和BasicMessageChannel
相关资料
这是一份全面 详细的Android Native与Flutter的通信方式 学习指南