flutter - 如何向 Flutter.EventChannel 添加多个监听器?
问题描述
我正在构建一个Flutter-Plugin
提供多个UI-Widgets
与本机(Android/iOS)库交互的工具。库到 Flutter 端的更新和/或状态更改通过Flutter EventChannelEvents
委托给 Flutter 。
这很好用,但是我想向同一个频道添加几个听众。但是每次我想注册第二个监听器时,第一个监听器都会被取消(StreamHandler.onCancel()
调用)。
private var channel01:EventChannel.EventSink ?= null
private var channel02:EventChannel.EventSink ?= null
//...
private var channel06:EventChannel.EventSink ?= null
//One EventChannel for every UI-Widget?!?!
EventChannel(registrar.messenger(), EVENT_CHANNEL_MAIN_SCREEN, JSONMethodCodec.INSTANCE).setStreamHandler(object : EventChannel.StreamHandler {
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
L.d("Listener attached for channel 01")
postEvent(MyEvent("Send some data on attach"))
channel01 = events
}
override fun onCancel(p0: Any?) {
L.d("Listener detached for channel 01")
channel01 = null
}
})
//Trigger some data via flutter stream from Android/iOS to Flutter
fun postEvent(event: MyEvent) {
activity.runOnUiThread {
channel01?.success(event)
channel02?.success(event)
}
}
所以目前我为每个 UI-Widget 使用一个 EventChannel,但我想有更好的方法吗?
顺便说一句,我Inherited Widget
在 Flutter 中使用了一个 DataProvider,它是唯一的监听器,EventChannel
并且将更改委托给树,但是由于“架构指南”,这是不可能的
问题
- 我可以在一个EventChannel 中添加多个侦听器吗?
- 我可以监视添加或删除了哪些侦听器吗?!
解决方案
无法将多个侦听器附加到一个通道。
合适的解决方案:将 EventChannel 附加到一个 (Inherited-)Widget 中,在树中提升这个小部件并使用颤动setState
逻辑更新您的小部件。
推荐阅读
- php - Symfony ManyToOne 删除关系而不更新子实体
- excel - 向包含字母和值的单元格添加值
- java - CosmosDB 记录 appName (mongo API)
- c# - 如何查看 Redis-Commands RESP 表示形式
- stanford-nlp - 如何在 typedDependencies 中保留标点符号?
- javascript - 如何显示最后一个重复值的错误消息
- cors - 如何将 withCredentials 选项传递给 Request?
- angular - 角度为 6 的主布局插座中的嵌套插座
- c# - VS Code (Mac) 缺少灯泡?
- python - 将列表中的值与列表中的字典值进行比较