onCancel
是否有类似StreamSubscription
的东西?
示例:
var subscription = someStream.listen((item) => null);
subscription.cancel(); // does this trigger any event?
我最终创建了一个_StreamSubscriptionDelegate来委派所有方法,因此当取消订阅时我可以添加一些逻辑,但是,也许有一个更简单的解决方案。
答案 0 :(得分:0)
如果流来自StreamController
,则将cancel
通知控制器。侦听器应跟踪自己的订阅,因此,如果客户端代码的一部分需要知道另一部分已取消了流,然后将订阅包装在记录您已取消的内容中,则是一种很好的方法。
另一种方法可能是在收听流之前包装流:
Stream<T> onCancel<T>(Stream<T> source, void onCancel()) async* {
bool isCancelled = true;
try {
await for (var event in source) {
yield event; // exits if cancelled.
}
isCancelled = false;
} finally {
if (isCancelled) onCancel();
}
}
或
Stream<T> onCancel<T>(Stream<T> source, void onCancel()) {
var sink = StreamController<T>();
sink.onListen = () {
var subscription = source.listen(sink.add, onError: sink.onError, onDone: sink.close);
sink
..onPause = subscription.pause
..onResume = subscription.resume
..onCancel = () {
subscription.cancel();
onCancel();
};
};
return sink.stream;
}