如何向 Flutter.EventChannel 添加多个监听器?

Posted

技术标签:

【中文标题】如何向 Flutter.EventChannel 添加多个监听器?【英文标题】:How to add several listener to Flutter.EventChannel? 【发布时间】:2020-11-18 23:23:11 【问题描述】:

我正在构建一个Flutter-Plugin,它提供了几个UI-Widgets 来与本机(android/ios)库进行交互。库到 Flutter 端的更新和/或状态更改通过Events 委托,通过Flutter EventChannel 委托给 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,但我想还有更好的方法吗?

顺便说一句,我在 Flutter 中使用了 Inherited Widget 作为 DataProvider,它是 EventChannel 的唯一侦听器,并将更改委托给树,但是由于“架构指南”,这是不可能的

问题

我可以向一个 EventChannel 添加多个侦听器吗? 我可以监控添加或删除了哪些侦听器吗?!

【问题讨论】:

【参考方案1】:

不可能将多个听众附加到一个频道。

合适的解决方案:将 EventChannel 附加到一个 (Inherited-)Widget 中,将此小部件在树中向上提起,并使用 Flutter setState 逻辑来更新您的小部件。

【讨论】:

以上是关于如何向 Flutter.EventChannel 添加多个监听器?的主要内容,如果未能解决你的问题,请参考以下文章

如何让特定段落向左浮动,图像向右浮动

如何向用户显示警报?

如何向 jtextfield 添加填充

如何向免费用户显示不同的页面,向付费用户显示不同的页面

如何向 CountDownTimer 添加闹钟?

如何加快向 ListView 添加项目?