您是不是必须在 Flutter 中手动处理来自 streamprovider 的流?

Posted

技术标签:

【中文标题】您是不是必须在 Flutter 中手动处理来自 streamprovider 的流?【英文标题】:Do you have to manually dispose streams from a streamprovider in Flutter?您是否必须在 Flutter 中手动处理来自 streamprovider 的流? 【发布时间】:2020-07-01 19:33:44 【问题描述】:

我在提供程序包的官方documentation 中找不到这个,streamprovider 是自动处理他们提供的流还是你必须手动处理?如果是这样,在哪里处理使用流提供程序公开的流的最佳做法是什么?

【问题讨论】:

你最终找到答案了吗? 【参考方案1】:

不,使用 StreamProvider 时不需要手动清理流。

StreamProvider 扩展了 DeferredInheritedProvider,其文档指出当 DeferredInheritedProvider 从树中移除时,正在监听的对象将被自动释放。

实际上,假设您不是自己制作 Stream,那么在清理实际 Stream 方面您无能为力,如 this GitHub comment 中所述。提供 Stream 的库应该清理 Stream。例如,如果我正在从 Firebase Auth 插件收听有关用户登录和退出我的应用的流,则该插件有责任清除该流。

但是,侦听 Stream(在本例中为 StreamProvider)的事物确实有责任清理其对该 Stream 的 StreamSubscription,StreamProvider 会这样做。

您可以在 Provider 的源代码here 中看到,在创建 DeferredStartListening 的实例时,会针对流调用 listen,该流返回一个 StreamSubscription。在方法结束时,对该订阅调用取消,这会清除 StreamSubscription。

【讨论】:

以上是关于您是不是必须在 Flutter 中手动处理来自 streamprovider 的流?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter StatefulWidget - 状态类继承?

Flutter圆形头像不支持来自存储的图像

我是否必须在Java中手动实现垃圾收集?

如何在android中缓存图像? [复制]

如何在 Flutter 中缓存来自 Firebase 的图像?

未处理的异常:类型“int”不是 Flutter 应用程序中“String”类型的子类型