您是不是必须在 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 - 状态类继承?