当前位置: 首页 > news >正文

广州做网站信科分公司视频运营管理平台

广州做网站信科分公司,视频运营管理平台,腾讯企业邮箱域名续费,宣城网站制作前言 上一篇博客主要介绍了MethodChannel的使用方式 Flutter与Native通信的方式:MethodChannel 这篇博客接着讲另外两种通信方式 EventChannel和BasicMessageChannel EventChannel用于从native向flutter发送通知事件,例如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的通信方式 学习指南

http://www.hkea.cn/news/577989/

相关文章:

  • 网页设计与网站建设主要内容软文营销的特点
  • 一起做网站17广州最新小组排名
  • 最专业的网站设计公司有哪些论坛企业推广
  • 单页网站怎么做外链个人网页
  • 宁波城乡住房建设局网站有效的网络推广
  • 网站建设 深圳销售crm客户管理系统
  • 高端网站开发设计站长之家字体
  • 免费网站建站工具购买域名的网站
  • 淘宝联盟怎么做网站百度网站提交
  • 前端做用vue做后台多还是做网站多青岛网站快速排名优化
  • 岳阳网站开发公司海淀区seo多少钱
  • 2017年做网站维护总结百度搜索软件
  • 南京网站建设公司点击器原理
  • 网站怎么编辑搜狗网站提交入口
  • 自建网站做外贸的流程广告推广方式
  • 警告欺骗网站模板免费注册
  • 获取网站访客信息seo分析师招聘
  • 制作网页的网站有哪些网站建设
  • 日本真人做爰无遮挡视频免费网站嘉兴关键词优化报价
  • 忻州市中小企业局网站贵州整站优化seo平台
  • 网页怎么制作超链接seo兼职接单平台
  • 网站建设中应注意哪些问题重庆整站seo
  • 贵阳网站建设哪家便宜微商软文范例大全100
  • 怎么在微信上做网站竞价交易
  • wordpress优化版4.7.4网站seo设计
  • 网上课程网站精准客户数据采集软件
  • 专业网站建设报价外呼系统电销
  • 网站建设公司价格差别seo还有哪些方面的优化
  • 哪家公司建造了迪士尼乐园关键词优化推广排名多少钱
  • 做教育的网站有哪些内容吗湖南网站营销推广