我正在按照BLOC模式在Flutter应用程序中使用dart Streams,因此从逻辑上讲,每当完成Bloc时,我都需要处置其中包含的所有流。
因此,在有状态窗口小部件提供的我的dispose方法上,我像这样调用排水方法:
dispose() async {
print('Started Dispose');
await _mainStream.drain();
print('_mainStream Drained');
}
所以发生的是我看到第一个打印,但是看不到第二个打印,这意味着我的流没有耗尽,并且如果我听到流并在遇到新事件时打印某些内容,那么我仍然会在Debug中看到该消息控制台,甚至我的Bloc都从小部件树中丢弃。
所以基本上我的流仍然在某个地方。我如何解决这个问题,因为它使我发疯。
答案 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");
}
如果您无法取消订阅,它将永久保留打印或直到您终止该过程。