在Dart中,如果我用两个侦听器侦听一个单击事件,我如何知道哪个先发生?
如果我写下面的Dart代码,我如何知道哪个点击处理程序首先发生在Dart中,如果我用两个侦听器侦听一个单击事件,我如何知道哪个先发生?,dart,dart-html,Dart,Dart Html,如果我写下面的Dart代码,我如何知道哪个点击处理程序首先发生 main(){ var button=新按钮元素(); var stream=button.onClick.asBroadcastStream(); 流。听(单击Handler1); 流。听(单击Handler2); } 假设我在另一段代码中,对前两个点击处理程序一无所知,但我注册了另一个 我可以知道流有两个侦听器吗 我可以暂停或取消所有其他订户吗 如果我在别处再次写入button.onClick.asBroadcastStre
main(){
var button=新按钮元素();
var stream=button.onClick.asBroadcastStream();
流。听(单击Handler1);
流。听(单击Handler2);
}
假设我在另一段代码中,对前两个点击处理程序一无所知,但我注册了另一个
- 我可以知道流有两个侦听器吗
- 我可以暂停或取消所有其他订户吗
- 如果我在别处再次写入
,它是否指向与button.onClick.asBroadcastStream()
中使用的流相同main
- 我可以在其中一个处理程序中说不要将事件传递给另一个广播侦听器吗?那是消费者吗
asBroadcastStream()
将不会产生您可能期望的结果。(注意:至少基于快速测试:虽然似乎表示不同,但当我找到时间时,我还需要进行更多的测试)
我可以在其中一个处理程序中说不要将事件传递给另一个广播侦听器吗
好的,在HTML领域中有一个例子,这意味着事件不会传播到其他元素,但它可能不是您想要的
为了能够停止其他侦听器中的事件触发,需要有调用侦听器的顺序。我相信顺序就是那些听众的注册顺序。从设计的角度来看,我不认为允许听众取消/暂停其他人是个好主意
HTML中的事件传播是有意义的,因为它是关于层次结构的,但在这里我们没有层次结构(即使在HTML中的事件中,单个元素也可能有多个侦听器)
没有办法为听众分配权重或定义重要性顺序,因此没有办法阻止事件也就不足为奇了
与其让听众了解彼此,操纵彼此,也许你应该尝试另一种方法来解决你的问题(不管是什么)
那是消费者吗
如果您希望允许其他流通过管道传输到您的类中,则可以实现该类
我可以知道流有两个侦听器吗
不,您有一个包装DOM事件处理的“流”。没有这样的功能
我可以暂停或取消所有其他订户吗
看看,也许吧
如果我在别处再次写入button.onClick.asBroadcastStream(),它是否指向main中使用的相同流
[更新]否,不会返回相同的流,因为每次调用时,onClick
getter都会返回一个新流。但是,返回的流已经是广播流,因此不应该对其调用asBroadcastStream()
。如果你这样做了,你会得到一个对同一个对象的引用
Stream<T> asBroadcastStream() => this;
Stream asBroadcastStream()=>此;
我可以在其中一个处理程序中说不要将事件传递给另一个广播侦听器吗?那是消费者吗
再一次,看一看,可能是。Hmm我可能错了,这个代码:但是先打印
false
,然后打印true
。所以它们指的是不同的对象。我可能会在有时间的时候更详细地调查这件事。。代码库中也可能有更改,请记住,您在答案中链接的内容与SDK的流实现不同:)您的代码创建了两个广播流。如果在创建的第一个广播流上调用asBroadcastStream(),则会得到相同的结果。这就是问题所在。如果是广播流,则流实现将返回此消息。我提到了问题中使用的流。嗯。我又看了一遍这个问题,我仍然认为他指的是我在截图中的代码示例中显示的内容,但我不打算对此进行争论,所以我让提问者决定他想要什么。我再看了一遍,问题是按钮。onClick
每次调用时都返回一个新的流,所以你是对的。我以为你每次都得到相同的流。如果获取返回的流并调用asBroadcastSteam()
,您将获得相同的实例。但是没有理由对它调用asBroadcastStream()
,因为它已经是一个广播流了。:)Event.stopPropagation()
不会阻止调用其他侦听器(--打印两次)。它只是停止传播,由于层次结构的原因,传播也恰好是纯粹的DOM。请记住,流用于多种目的,而不仅仅是用于DOM。:)您是对的,这就是即时版本的用途,但是您只停止后面的回调,并且不能保证顺序。。。苏尔