Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Events 取消对事件的每个处理程序的注册_Events_Event Handling_Dart - Fatal编程技术网

Events 取消对事件的每个处理程序的注册

Events 取消对事件的每个处理程序的注册,events,event-handling,dart,Events,Event Handling,Dart,我们可以在一次调用中取消流的每个订阅吗 在大多数dart示例中,我们可以看到取消订阅的主要方法是直接从调用Cancel方法,但我们需要存储这些订阅 var s = myElement.onClick.listen(myHandler); //storing the sub s.Cancel() //unsuscribing the handler 有没有一种方法可以取消给定流的每个订阅而不存储它们 可能是这样的: myElement.onClick.subscriptions.forEach(

我们可以在一次调用中取消流的每个订阅吗

在大多数dart示例中,我们可以看到取消订阅的主要方法是直接从调用Cancel方法,但我们需要存储这些订阅

var s = myElement.onClick.listen(myHandler); //storing the sub
s.Cancel() //unsuscribing the handler
有没有一种方法可以取消给定流的每个订阅而不存储它们

可能是这样的:

myElement.onClick.subscriptions.forEach((s)=> s.Cancel());

您必须存储引用才能取消事件。

使用装饰图案:

类MyStream实现流{
溪流;;
列表(sub);;
/*
使用noSuchMethod将所有调用直接传递到_流,
并简单地重写listen调用,并添加一个新方法来removeAllListeners
*/
StreamSubscription侦听(处理程序){
var sub=_stream.listen(处理程序);
_附件。添加(附件);
返回子节点;
}
void removeAllListeners(){
_subs.forEach((s)=>s.cancel());
_subs.clear();
}
}
如果您想在html元素上使用它,您可以在
MyElement
上使用完全相同的装饰器模式,方法是装饰
Element
。例如:

类MyElement实现元素{
元素_元素;
/*
使用noSuchMethod将所有调用直接传递给_元素并简单地重写
您希望能够从中移除所有侦听器的事件流
*/
MyElement(元素){
_元素=元素;
_onClick=newmystream(_element.onClick);
}
MyStream onClick;
MyStream get onClick=>\u onClick;//在此处重写原始流getter:)
}
然后相应地使用:

var superDivElement=newmyelement(new DivElement());
superDivElement.onClick.listen(处理程序);
//...
superDivElement.onClick.removeAllListeners();