提供者与 InheritedWidget
Posted
技术标签:
【中文标题】提供者与 InheritedWidget【英文标题】:Provider vs. InheritedWidget 【发布时间】:2019-12-01 03:01:45 【问题描述】:我是不是错了,或者如果我们只是想将一个值传递给 Widget
树,Provider
只是一个带有 dispose
方法的 InheritedWidget
?
【问题讨论】:
【参考方案1】:是的。 Provider 确实主要是基于 Inheritedwidgets 的特性。
如果你想自己做,那很好。但是您很快就会意识到,如果没有提供者,您将有数百条无用的重复行。
Provider 基本上采用了 InheritedWidgets 的逻辑,但将样板文件减少到严格的最小值。
【讨论】:
【参考方案2】:Provider
不是必须的,但应该。
首先,它由 Flutter Team 推广,并且足够灵活,可以处理几乎所有的状态管理解决方案。
说InheritedWidget
和dispose
可能不公平,因为Provider
有太多不同的用例,并且继承了一些您可能在其他任何地方都找不到的优化。
如果您在大型应用程序中使用InheritedWidget
,build
方法总是重建整个构建方法。但是有了Provider
,你就有了Consumer
小部件,它可以非常具体地控制build
方法的特定块,所以你有更高的效率。侦听器的复杂性也低于 InheritedWidgets'(O(N) vs O(N²))。
问题在于,由于 Flutter 最初是打算作为 UI 框架的,所以默认的状态管理解决方案也是面向 UI 的。
最后,由于您需要针对不同的项目使用不同的状态管理模式,因此 imo 提供了一个包罗万象的方案。
【讨论】:
但不是使用 Consumer 可能只是使用标准的 Builder 方法。使用 Builder,您也可以控制特定的构建方法块。【参考方案3】: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
【讨论】:
以上是关于提供者与 InheritedWidget的主要内容,如果未能解决你的问题,请参考以下文章