提供者与 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 推广,并且足够灵活,可以处理几乎所有的状态管理解决方案。

InheritedWidgetdispose 可能不公平,因为Provider 有太多不同的用例,并且继承了一些您可能在其他任何地方都找不到的优化。

如果您在大型应用程序中使用InheritedWidgetbuild 方法总是重建整个构建方法。但是有了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的主要内容,如果未能解决你的问题,请参考以下文章

Flutter核心类分析深入理解数据共享InheritedWidget

flutter系列InheritedWidget介绍

Flutter功能型组件之数据共享

一文搞懂InheritedWidget局部刷新机制

从零开始的Flutter之旅: Provider

为啥我需要 Flutter 中的 InheritedWidget