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

Do you have to manually dispose streams from a streamprovider in Flutter?

我在 provider 包的官方 documentation 中找不到这个,streamprovider 是自动处理他们提供的流,还是您必须手动执行此操作?如果是这样,在何处处置使用流提供程序公开的流的最佳做法是什么?

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

StreamProvider 扩展了 DeferredInheritedProvider,它的文档声明当 DeferredInheritedProvider 从树中移除时,被监听的对象将被自动处理。

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

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

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