【发布时间】:2020-06-13 15:47:49
【问题描述】:
在我们的 Flutter 应用程序中,我们存在内存泄漏和未关闭的流。我们追溯源代码如下:
Rx.combineLatest(...).asBroadcastStream()
RxDart .combineLatest() 的结果是单订阅流。添加.asBroadcastStream() 使流可以方便地用于我们的各种 Flutter 显示器。但是,当这些显示关闭时,正在组合的流仍然处于活动状态。
【问题讨论】:
在我们的 Flutter 应用程序中,我们存在内存泄漏和未关闭的流。我们追溯源代码如下:
Rx.combineLatest(...).asBroadcastStream()
RxDart .combineLatest() 的结果是单订阅流。添加.asBroadcastStream() 使流可以方便地用于我们的各种 Flutter 显示器。但是,当这些显示关闭时,正在组合的流仍然处于活动状态。
【问题讨论】:
来自.asBroadcastStream() 文档:
返回的流将在添加第一个订阅者时订阅此流,并且将保持订阅状态直到此流结束或回调取消订阅。
所以按照设计,流一直存在,直到明确取消。要在最后一个侦听器取消时取消订阅,请使用:
Rx.combineLatest(...).asBroadcastStream( onCancel: (sub) => sub.cancel() )
Stream.asBroadcastStream - Easy to cause leaks, what is the rationale? #26686有进一步讨论
【讨论】: