您是否必须在Flutter中手动处理来自流提供程序的流?

时间:2020-03-20 16:23:59

标签: flutter

我在提供程序包的官方documentation中找不到此消息,streamprovider是否会自动处理它们正在提供的流的处理,还是您必须手动执行此操作?如果是这样,在哪里放置使用流提供程序公开的流的最佳实践是什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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