我怎么知道什么时候取消StreamSubscription?

时间:2020-09-19 17:12:31

标签: dart dart-async

onCancel是否有类似StreamSubscription的东西?

示例:

var subscription = someStream.listen((item) => null);

subscription.cancel(); // does this trigger any event?

我最终创建了一个_StreamSubscriptionDelegate来委派所有方法,因此当取消订阅时我可以添加一些逻辑,但是,也许有一个更简单的解决方案。

1 个答案:

答案 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;
}