取消订阅事件的事件处理程序

时间:2014-01-22 08:31:29

标签: events event-handling dart

我们可以在一次通话中取消流的每个订阅吗?

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

var s = myElement.onClick.listen(myHandler); //storing the sub
s.Cancel() //unsuscribing the handler

有没有办法取消给定流的每个订阅而不存储它们?

可能是这样的东西:

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

2 个答案:

答案 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元素上使用它,你可以通过装饰MyElementElement上完成相同的装饰器模式。例如:

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)

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