在Dart中,如果我听两个听众的点击事件,我怎么知道哪个先发生?

Jun*_*ont 6 dart dart-html

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

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

  stream.listen(clickHandler1);
  stream.listen(clickHandler2);
}
Run Code Online (Sandbox Code Playgroud)

假设我在其他代码中对前两个点击处理程序一无所知,但我注册了另一个.

  • 我能知道该流有两个监听器吗?
  • 我可以暂停或取消所有其他订阅者吗?
  • 如果我button.onClick.asBroadcastStream()在其他地方再次写入,它是否指向与使用的相同的流main
  • 我可以在其中一个处理程序中说不将事件传递给其他广播监听器吗?那是消费者吗?

Kai*_*ren 6

假设我在其他代码中对前两个点击处理程序一无所知,但我注册了另一个.

我能知道该流有两个监听器吗?

不,你不能.你可以扩展流类或包装它并自己提供这个功能,但它不是一个好的设计选择,因为我认为听众不应该知道其他的听众.你准备做什么?也许有一种比让听众了解对方更好的方法.

我可以暂停或取消所有其他订阅者吗?

您可以仅取消/暂停/恢复您正在处理的订户.同样,您可能不应该触及其他侦听器,但我猜您可以包装/扩展Stream类以具有此行为.

如果我在其他地方再次编写button.onClick.asBroadcastStream(),它是否指向与main中使用的相同的流?

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

我可以在其中一个处理程序中说不将事件传递给其他广播监听器吗?

嗯,stopPropagation()在HTML领域,这意味着事件不会传播到其他元素,但它可能不是你想要的.

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

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

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

而不是让听众彼此了解并互相操纵,也许你应该试着想出另一种方法来解决你的问题(不管是什么).

那是消费者吗?

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