Events 取消对事件的每个处理程序的注册
我们可以在一次调用中取消流的每个订阅吗 在大多数dart示例中,我们可以看到取消订阅的主要方法是直接从调用Cancel方法,但我们需要存储这些订阅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(
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();