我可以知道 StreamSubscription 何时被取消吗?
can I know when a StreamSubscription is cancelled?
是否有类似 onCancel
的 StreamSubscription
?
示例:
var subscription = someStream.listen((item) => null);
subscription.cancel(); // does this trigger any event?
我最终创建了一个委托所有方法的 _StreamSubscriptionDelegate,因此我可以在取消订阅时添加一些逻辑,但是,也许有更简单的解决方案。
如果流来自 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;
}
是否有类似 onCancel
的 StreamSubscription
?
示例:
var subscription = someStream.listen((item) => null);
subscription.cancel(); // does this trigger any event?
我最终创建了一个委托所有方法的 _StreamSubscriptionDelegate,因此我可以在取消订阅时添加一些逻辑,但是,也许有更简单的解决方案。
如果流来自 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;
}