gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:05:33 24 4
gpt4 key购买 nike

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

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

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

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

看起来像这样的东西:
myElement.onClick.subscriptions.forEach((s)=> s.Cancel());

最佳答案

使用装饰器模式:

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();

关于events - 取消订阅事件的事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21277790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com