在流上调用Drain()永远不会返回,流也永远不会关闭

时间:2019-08-14 14:48:15

标签: flutter dart

我正在按照BLOC模式在Flutter应用程序中使用dart Streams,因此从逻辑上讲,每当完成Bloc时,我都需要处置其中包含的所有流。

因此,在有状态窗口小部件提供的我的dispose方法上,我像这样调用排水方法:

dispose() async {
    print('Started Dispose');

    await _mainStream.drain();

    print('_mainStream Drained');
  }

所以发生的是我看到第一个打印,但是看不到第二个打印,这意味着我的流没有耗尽,并且如果我听到流并在遇到新事件时打印某些内容,那么我仍然会在Debug中看到该消息控制台,甚至我的Bloc都从小部件树中丢弃。

所以基本上我的流仍然在某个地方。我如何解决这个问题,因为它使我发疯。

1 个答案:

答案 0 :(得分:1)

要停止收听流,请取消订阅,而不要呼叫drain。 在某种意义上说,流可以一直发出,直到它们关闭为止。因此,尝试排空这样的流非常危险,因为它将永远无法完成。

以下是您如何取消订阅的简单示例:

final foreverStream = Stream.periodic(Duration(milliseconds: 10), (i) => i);

main() async {
  final subscription = foreverStream.listen((event) => print("EVENT: $event"));  

  await Future.delayed(Duration(milliseconds: 100));

  await subscription.cancel();
  print("Done");
}

如果您无法取消订阅,它将永久保留打印或直到您终止该过程。