文章目录
- 1. 知识回顾
- 2. 示例代码
- 3. 经验总结
我们在上一章回中介绍了MethodChannel的使用方法,本章回中将介绍EventChannel的使用方法.闲话休提,让我们一起Talk Flutter吧。
1. 知识回顾
我们在前面章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种通道:EventChannel.该通道主要通过Stream实现通信功能,该通道
主要用于消息类通信功能,它只能通过原生平台向Flutter程序发送消息,属于单向通信,本章回中将详细介绍它的使用方法。
2. 示例代码
通道的使用方法在前面章节已经介绍过,不过比较抽象,我们在这里通过具体的示例代码来演示:
- 在Flutter中创建通道,使用构造方法就可以创建通道,方法的参数最好使用域名/功能名这样的形式,因为在原生代码中会通过该名称获取该通道;
flutterEventChannel = EventChannel("www.acf.com/event");
- 监听通道中的方法或者事件.这里使用通道的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);
}
- 在原生平台的代码中获取通道;这里继承了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)
}
}
- 给通道设置监听器,在监听器中实现原生平台上特有的功能;设置监听器通过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平台上实现类似的代码,我在这里就不演示了,因为它们的思路相同。
3. 经验总结
本章回中介绍了EventChannel通道相关的知识,原生平台通过Stream给Flutter发送数据。这样便实现了通信功能。我在这里就不演示程序的运行结果了,建议大家
自己动手去实现。不过我分享一些编译时的经验。
- EventChannel通道常用来发送一些消息,它的用法和Stream类似;
- 编写channel中的代码时需要使用xCode打开flutter的项目;
- 编写channel中的代码时最后使用androidStudio重新打开andorid项目,这样会自动生成android项目文件,而不要在原来的flutter项目中编辑android代码。
- 运行时IOS原生代码需要使用xCode编译运行,Android原生代码需要在flutter项目中编译运行才有效果。
看官们,与"如何使用EventChannel"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!