【发布时间】:2020-06-08 09:27:03
【问题描述】:
请有人解释使用 StreamBuilder 小部件和 StreamProvider(提供程序包)之间的本质区别(缺点/优点)。为什么以及何时需要使用 StreamProvider?
附:此外,为什么我需要这么多其他提供者(如 ListenableProvider、ChangeNotifierProvider 等)?除了命名之外,它们还有什么优势?我可以使用 Provider 构造函数来创建要提供的任何类型的数据,对吧?
【问题讨论】:
-
主要区别是你不需要关心StreamProvider的事件,而StreamBuilder提供者需要你有条件地检查当前Snapshot的状态(ConnectionState.done, .waiting, hasError , hasData 等)
-
@GaurisJavier,我不同意。 StreamBuilder/StreamProvider 都有
builder方法和相应的参数snapshopt或object。并且为了避免null在StreamBuilder中崩溃,您需要检查snapshot.hasData,但在StreamProvider中,您需要检查object != null是否。所以这不是一个案例。 -
构建器方法有不同的签名,如果你注意到 StreamProvider 一个,没有 Snapshot 参数,而是有一个错误构建器,转换构建器。 StreamProvider 不知道哪个状态流是(ConnectionState.done、.waiting)。我说过使用 StreamProvider 你不需要关心事件,这是真的。你没有它的参数快照。而且您还有参数 updateShouldNotify 用于检查数据何时有效,不只是是否为空。
-
哦,我从另一边问。什么时候可以使用 StreamProvider? StreamProvider 在 StreamBuilder 之前的优势是什么?如何定义我需要 StreamBuilder 或 StreamProvider 的时刻?原则上这是我的问题。附:此外,为什么我需要这么多其他提供者(如 ListenableProvider、ChangeNotifierProvider 等)?除了命名之外,它们还有什么优势?我可以使用 Provider 构造函数来创建要提供的任何类型的数据,对吧?
-
确切地说,您可以通过 Provider 上下文 (Provider.of
) 访问流,如果您没有非常深的小部件树,则没有太大区别。但是当你有像这样的非常深的小部件树时:StreamProvider -> MyCustomParent -> AnotherChildWidget -> AnotherChildWidgetDeeper - Provider.of (context) 。否则,使用 StreamBuilder,您需要将 Snpashot 数据作为构造器引用传递,直到最深的孩子。难以维护的东西。
标签: flutter dart provider stream-builder