【发布时间】:2019-12-01 03:01:45
【问题描述】:
我是不是错了,或者如果我们只是想将一个值传递给 Widget 树,Provider 只是一个带有 dispose 方法的 InheritedWidget?
【问题讨论】:
我是不是错了,或者如果我们只是想将一个值传递给 Widget 树,Provider 只是一个带有 dispose 方法的 InheritedWidget?
【问题讨论】:
是的。 Provider 确实主要是基于 Inheritedwidgets 的特性。
如果你想自己做,那很好。但是您很快就会意识到,如果没有提供者,您将有数百条无用的重复行。
Provider 基本上采用了 InheritedWidgets 的逻辑,但将样板文件减少到严格的最小值。
【讨论】:
Provider 不是必须的,但应该。
首先,它由 Flutter Team 推广,并且足够灵活,可以处理几乎所有的状态管理解决方案。
说InheritedWidget 和dispose 可能不公平,因为Provider 有太多不同的用例,并且继承了一些您可能在其他任何地方都找不到的优化。
如果您在大型应用程序中使用InheritedWidget,build 方法总是重建整个构建方法。但是有了Provider,你就有了Consumer 小部件,它可以非常具体地控制build 方法的特定块,所以你有更高的效率。侦听器的复杂性也低于 InheritedWidgets'(O(N) vs O(N²))。
问题在于,由于 Flutter 最初是打算作为 UI 框架的,所以默认的状态管理解决方案也是面向 UI 的。
最后,由于您需要针对不同的项目使用不同的状态管理模式,因此 imo 提供了一个包罗万象的方案。
【讨论】:
Flutter 文档对此有一个很好的部分,他们在其中讨论了应用程序中的状态管理(其中很大一部分是将值向下传递)。
Flutter 有机制让小部件为它们的后代(换句话说,不仅是它们的子代,还包括它们下面的任何小部件)提供数据和服务。正如您对 Flutter 所期望的那样,Everything is a Widget™,这些机制只是特殊类型的小部件——InheritedWidget、InheritedNotifier、InheritedModel 等等。我们不会在这里介绍这些内容,因为它们对于我们正在尝试做的事情来说有点低级。
相反,我们将使用与低级小部件一起使用但易于使用的包。它被称为提供者。
因此,截至 2021 年底,似乎建议使用 provider 包,除非您需要较低级别的访问权限 - 在这种情况下,您可以使用 Inherited* 小部件。例如,如果您编写了自己的 provider 版本,那么您将需要较低级别的访问权限。
我上面引用的文档位于https://docs.flutter.dev/development/data-and-backend/state-mgmt/simple#accessing-the-state
【讨论】: