第三百九十九回

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

在这里插入图片描述

知识回顾

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

示例代码

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

  1. 在Flutter中创建通道,使用构造方法就可以创建通道,方法的参数最好使用域名/功能名这样的形式,因为在原生代码中会通过该名称获取该通道;
  flutterEventChannel = EventChannel("www.acf.com/event");
  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. 在原生平台的代码中获取通道;这里继承了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. 给通道设置监听器,在监听器中实现原生平台上特有的功能;设置监听器通过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")
    }
}

上面的代码中使用回调方法的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"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

相关推荐

  1. 第二

    2024-03-14 09:42:02       41 阅读
  2. 第二

    2024-03-14 09:42:02       25 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-14 09:42:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-14 09:42:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-14 09:42:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-14 09:42:02       18 阅读

热门阅读

  1. CSS 01

    CSS 01

    2024-03-14 09:42:02      16 阅读
  2. Rust 如何优雅关闭 channel

    2024-03-14 09:42:02       25 阅读
  3. 【MySQL 系列】MySQL 函数篇

    2024-03-14 09:42:02       21 阅读
  4. SQL进阶(五):With 函数 vs 视图函数

    2024-03-14 09:42:02       20 阅读
  5. 【 React 】React 中引入css的方式有哪几种?区别?

    2024-03-14 09:42:02       19 阅读
  6. CSS常见选择器

    2024-03-14 09:42:02       18 阅读
  7. vue进阶——动态引入组件

    2024-03-14 09:42:02       19 阅读
  8. 大带宽服务器的作用有哪些?

    2024-03-14 09:42:02       17 阅读
  9. 本地socket通信服务器,客户端

    2024-03-14 09:42:02       20 阅读
  10. 【无标题】

    2024-03-14 09:42:02       17 阅读
  11. C#中IEnumerable<string>和IList<string>的区别

    2024-03-14 09:42:02       18 阅读
  12. C# 中多线程锁的使用经验

    2024-03-14 09:42:02       18 阅读
  13. ffmpeg的使用不简单

    2024-03-14 09:42:02       23 阅读
  14. 小结:Node.js Express VS Koa

    2024-03-14 09:42:02       21 阅读
  15. AcWing 503. 借教室(每日一题)

    2024-03-14 09:42:02       18 阅读