我可以知道 StreamSubscription 何时被取消吗?

can I know when a StreamSubscription is cancelled?

是否有类似 onCancelStreamSubscription

示例:

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