我们可以在一次通话中取消流的每个订阅吗?
在大多数dart示例中,我们可以看到取消订阅的主要方法是直接从StreamSubscription调用取消方法,但我们需要存储这些订阅。
var s = myElement.onClick.listen(myHandler); //storing the sub
s.Cancel() //unsuscribing the handler
有没有办法取消给定流的每个订阅而不存储它们?
可能是这样的东西:
myElement.onClick.subscriptions.forEach((s)=> s.Cancel());
答案 0 :(得分:4)
使用装饰器模式:
class MyStream<T> implements Stream<T>{
Stream<T> _stream;
List<StreamSubscription<T>> _subs;
/*
use noSuchMethod to pass all calls directly to _stream,
and simply override the call to listen, and add a new method to removeAllListeners
*/
StreamSubscription<T> listen(handler){
var sub = _stream.listen(handler);
_subs.add(sub);
return sub;
}
void removeAllListeners(){
_subs.forEach((s) => s.cancel());
_subs.clear();
}
}
如果你想在html元素上使用它,你可以通过装饰MyElement
在Element
上完成相同的装饰器模式。例如:
class MyElement implements Element{
Element _element;
/*
use noSuchMethod to pass all calls directly to _element and simply override
the event streams you want to be able to removeAllListeners from
*/
MyElement(Element element){
_element = element;
_onClick = new MyStream<MouseEvent>(_element.onClick);
}
MyStream<MouseEvent> _onClick;
MyStream<MouseEvent> get onClick => _onClick; //override the original stream getter here :)
}
然后相应地使用:
var superDivElement = new MyElement(new DivElement());
superDivElement.onClick.listen(handler);
//...
superDivElement.onClick.removeAllListeners();
答案 1 :(得分:1)
您必须存储引用才能取消该事件。