首页 > 解决方案 > 如何向 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并且将更改委托给树,但是由于“架构指南”,这是不可能的

问题

标签: flutterflutter-channelevent-channel

解决方案


无法将多个侦听器附加到一个通道。

合适的解决方案:将 EventChannel 附加到一个 (Inherited-)Widget 中,在树中提升这个小部件并使用颤动setState逻辑更新您的小部件。


推荐阅读