dart - 在 Dart 中,如果我用两个监听器监听一个 click 事件,我怎么知道哪个先发生?

标签 dart dart-html

如果我编写以下 Dart 代码,我怎么知道哪个点击处理程序首先发生?

main() {
  var button = new ButtonElement();
  var stream = button.onClick.asBroadcastStream();

  stream.listen(clickHandler1);
  stream.listen(clickHandler2);
}

假设我在其他代码中对前两个点击处理程序一无所知,但我注册了另一个。
  • 我可以知道流有两个监听器吗?
  • 我可以暂停或取消所有其他订阅者吗?
  • 如果我写 button.onClick.asBroadcastStream()再次在其他地方,它是否指向与 main 中使用的流相同的流? ?
  • 我可以在其中一个处理程序中说不要将事件传递给另一个广播监听器吗?那是消费者吗?
  • 最佳答案

    Let's say I'm in other code that doesn't know anything about the first two click handlers, but I register another one.

    Can I know that the stream has two listeners?



    不,你不能。您可以扩展流类或包装它并自己提供此功能,但这不是一个好的设计选择,因为我认为监听器不应该了解其他监听器。你到底想做什么?也许有比让听众彼此了解更好的方法。

    Can I pause or cancel all other subscribers?



    您可以 cancel/pause/resume只有您正在处理的订户。同样,您可能不应该触及其他监听器,但我想您可以包装/扩展 Stream 类以具有此行为。

    If I write button.onClick.asBroadcastStream() again elsewhere, does it point to the same stream as was used in main?



    不,至少不是在当前版本的 SDK 中。因此,不幸的是,您需要在某处存储对此广播流的引用,并引用它,因为调用 asBroadcastStream()多次不会产生您可能期望的结果。 (注意:至少基于快速测试:http://d.pr/i/Ip0K 虽然 documentation 似乎表示不同,但我还没有在找到时间时进行更多测试)。

    Can I say in one of the handlers to not pass event on to the other broadcast listener?



    嗯,还有 stopPropagation() 在 HTML 领域,这意味着该事件不会传播到其他元素,但这可能不是您想要的。

    为了能够停止在其他监听器中触发的事件,需要有一个调用监听器的顺序。我相信顺序是那些听众的注册顺序。从设计的角度来看,我认为让听众取消/暂停其他人不是一个好主意。

    HTML 中的事件传播是有意义的,因为它是关于层次结构的,但在这里我们没有(即使在 HTML 中的事件的情况下,单个元素也可以有多个监听器)。

    没有办法为听众分配权重或定义重要性的顺序,因此没有办法停止事件也就不足为奇了。

    与其让听众彼此了解并相互操纵,也许您应该尝试想出另一种方法来解决您的问题(无论是什么)。

    Is that a consumer?



    StreamConsumer 只是一个类,如果您想允许其他流通过管道传输到您的类中,您可以实现该类。

    关于dart - 在 Dart 中,如果我用两个监听器监听一个 click 事件,我怎么知道哪个先发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16125800/

    相关文章:

    flutter - Dart/Flutter 检查值是否为整数/整数

    flutter - Flutter:我的变量中有NULL,如何使用我的函数?

    dart - 如何在AngularDart中大写acx-scorecard值文本

    dart - 在 Dart 中删除带有绑定(bind)事件的 DOM 元素

    firebase - 仅在 flutter 中热重载后才检索值

    dart - 如何为函数参数声明自定义类型?

    dart - Google Dart构建中的/packages/$ sdk/文件夹是做什么用的?

    Dart Html - 将 Blob 转换为文件

    dart - 如何在 DART 语言中实现 DOM 数据绑定(bind)

    dart - 如何使用Dart和网络以60fps的速度驱动动画循环?