gpt4 book ai didi

flutter - 在 Stream 上调用 Drain() 永远不会返回并且流永远不会关闭

转载 作者:IT王子 更新时间:2023-10-29 06:42:01 26 4
gpt4 key购买 nike

我在我的 Flutter 应用程序中按照 BLOC 模式使用 dart Streams,所以从逻辑上讲,每当我用完一个 Bloc 时,我都需要处理其中的所有流。

因此,在有状态小部件提供的处置方法上,我将这样调用 drain 方法:

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

await _mainStream.drain();

print('_mainStream Drained');
}

所以发生的事情是我看到了第一个打印但从未看到第二个打印,这意味着我的流没有耗尽,如果我收听流并在我收到新事件时打印一些东西,我仍然会在调试中看到该消息控制台甚至我的 Bloc 已从小部件树中处置。

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

最佳答案

要停止收听流,您可以取消订阅,而不是调用 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");
}

如果您取消订阅失败,它会一直打印直到您终止该进程。

关于flutter - 在 Stream 上调用 Drain() 永远不会返回并且流永远不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57497064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com