如果我编写以下 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/