第三百九十九回

文章目录

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

知识回顾

我们在前面章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种通道:EventChannel.该通道主要通过Stream实现通信功能,该通道

主要用于消息类通信功能,它只能通过原生平台向Flutter程序发送消息,属于单向通信,本章回中将详细介绍它的使用方法。

示例代码

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

  1. 在Flutter中创建通道,使用构造方法就可以创建通道,方法的参数最好使用域名/功能名这样的形式,因为在原生代码中会通过该名称获取该通道;
dart 复制代码
  flutterEventChannel = EventChannel("www.acf.com/event");
  1. 监听通道中的方法或者事件.这里使用通道的receiveBroadcastStream()方法监听通道中的事件,它可以获取到方法的的返回值和错误信息。它本质上是Stream
    因此它的使用方法和Stream相同,我们已经介绍过Stream,因此不做详细介绍。
dart 复制代码
    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()方法,在该方法中获取通道;
dart 复制代码
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回复消息,详细如下:
dart 复制代码
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"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!
相关推荐
talk_83 个月前
通过相机来获取图片
数码相机·移动开发flutter
talk_87 个月前
第四百四十二回 再谈flutter_launcher_icons包
移动开发flutter·launcher_icon·修改桌面图标
talk_88 个月前
第二百二十三回
移动开发flutter
talk_88 个月前
第四百一十五回
移动开发flutter
talk_88 个月前
第四百一十回
移动开发flutter
talk_88 个月前
第三百八十九回
移动开发flutter
talk_89 个月前
第三百八十五回
移动开发flutter
talk_810 个月前
第二百九十六回
前端·移动开发flutter
talk_810 个月前
第二百九十回
数码相机·移动开发flutter