Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Dart中,如果我用两个侦听器侦听一个单击事件,我如何知道哪个先发生?_Dart_Dart Html - Fatal编程技术网

在Dart中,如果我用两个侦听器侦听一个单击事件,我如何知道哪个先发生?

在Dart中,如果我用两个侦听器侦听一个单击事件,我如何知道哪个先发生?,dart,dart-html,Dart,Dart Html,如果我写下面的Dart代码,我如何知道哪个点击处理程序首先发生 main(){ var button=新按钮元素(); var stream=button.onClick.asBroadcastStream(); 流。听(单击Handler1); 流。听(单击Handler2); } 假设我在另一段代码中,对前两个点击处理程序一无所知,但我注册了另一个 我可以知道流有两个侦听器吗 我可以暂停或取消所有其他订户吗 如果我在别处再次写入button.onClick.asBroadcastStre

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

main(){
var button=新按钮元素();
var stream=button.onClick.asBroadcastStream();
流。听(单击Handler1);
流。听(单击Handler2);
}
假设我在另一段代码中,对前两个点击处理程序一无所知,但我注册了另一个

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

我可以知道流有两个侦听器吗

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

我可以暂停或取消所有其他订户吗

您只能选择与您打交道的订户。同样,您可能不应该接触其他侦听器,但我想您可以包装/扩展Stream类来实现这种行为

如果我在别处再次写入button.onClick.asBroadcastStream(),它是否指向main中使用的相同流

不,至少在当前版本的SDK上没有。因此,不幸的是,您需要将对该广播流的引用存储在某个位置并引用它,因为多次调用
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。:)您是对的,这就是即时版本的用途,但是您只停止后面的回调,并且不能保证顺序。。。苏尔