• 第四百零一回



    我们在上一章回中介绍了MethodChannel的使用方法,本章回中将介绍EventChannel的使用方法.闲话休提,让我们一起Talk Flutter吧。

    在这里插入图片描述

    知识回顾

    我们在前面章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种通道:EventChannel.该通道主要通过Stream实现通信功能,该通道
    主要用于消息类通信功能,它只能通过原生平台向Flutter程序发送消息,属于单向通信,本章回中将详细介绍它的使用方法。

    示例代码

    通道的使用方法在前面章节已经介绍过,不过比较抽象,我们在这里通过具体的示例代码来演示:

    1. 在Flutter中创建通道,使用构造方法就可以创建通道,方法的参数最好使用域名/功能名这样的形式,因为在原生代码中会通过该名称获取该通道;
      flutterEventChannel = EventChannel("www.acf.com/event");
    
    • 1
    1. 监听通道中的方法或者事件.这里使用通道的receiveBroadcastStream()方法监听通道中的事件,它可以获取到方法的的返回值和错误信息。它本质上是Stream
      因此它的使用方法和Stream相同,我们已经介绍过Stream,因此不做详细介绍。
        var streamSubscription = flutterEventChannel.receiveBroadcastStream()
            .listen((event) { debugPrint("data: ${event.toString()}");},
        onError: (e) => debugPrint('error: ${e.toString()}'),
        onDone: () => debugPrint('event done'),
        cancelOnError: true);
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 在原生平台的代码中获取通道;这里继承了FlutterActivity类并且重写类中的configureFlutterEngine()方法,在该方法中获取通道;
    class MainActivity: FlutterActivity() {
        private val eventChannel = "www.acf.com/event"
        //重写方法来设置chanel监听器,用来监听channel中的方法
        override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
            super.configureFlutterEngine(flutterEngine)
    
            //通过方法中的flutterEngine获取MethodChannel对象
            val eventChannel = EventChannel(flutterEngine.dartExecutor.binaryMessenger,eventChannel)
    
            // 设置监听器用来监听channel中的事件
            var sHandler = StreamHandlerImpl()
            eventChannel.setStreamHandler(sHandler)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 给通道设置监听器,在监听器中实现原生平台上特有的功能;设置监听器通过setStreamHandler()方法实现,详细可以参考上面的代码片段。该方法需要传递一个
      StreamHandler类型的对象,我们创建一个该类的子类,并且在类中重写了相关的方法,在方法给给Stream回复消息,详细如下:
    class StreamHandlerImpl : EventChannel.StreamHandler {
        override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
            events?.success("native event")
        }
    
        override fun onCancel(arguments: Any?) {
            TODO("Not yet implemented")
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    上面的代码中使用回调方法的events参数给Stream回复消息,Stream收到消息后可以获取到消息的内容。
    上面步骤中的3和4是在Andoird平台上编写的,位于MainActivity.kt文件中。我们还需要在IOS平台上实现类似的代码,我在这里就不演示了,因为它们的思路相同。

    经验总结

    本章回中介绍了EventChannel通道相关的知识,原生平台通过Stream给Flutter发送数据。这样便实现了通信功能。我在这里就不演示程序的运行结果了,建议大家
    自己动手去实现。不过我分享一些编译时的经验。

    • EventChannel通道常用来发送一些消息,它的用法和Stream类似;
    • 编写channel中的代码时需要使用xCode打开flutter的项目;
    • 编写channel中的代码时最后使用androidStudio重新打开andorid项目,这样会自动生成android项目文件,而不要在原来的flutter项目中编辑android代码。
    • 运行时IOS原生代码需要使用xCode编译运行,Android原生代码需要在flutter项目中编译运行才有效果。
      看官们,与"如何使用EventChannel"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!
  • 相关阅读:
    HTTPS应该搞懂了吧。
    go-zero&go web集成redis实战
    测试号管理,接口配置信息,配置失败的问题
    Git常用命令,满足日常开发使用,赶快收藏起来吧
    《福格行为模型》笔记 --- ta为什么总是想得多做得少
    JAVA应用场景拦截器、过滤器、监听器
    c++标准模板(STL)- 算法 (std::remove, std::remove_if)
    BM6 判断链表中是否有环——Java Set集合&&hashSet哈希表应用
    使用注解方式和XML配置方式完成AOP编程
    三调地类图斑统计分析——GP后端实现
  • 原文地址:https://blog.csdn.net/talk_8/article/details/136722625