为啥我需要 Flutter 中的 InheritedWidget

Posted

技术标签:

【中文标题】为啥我需要 Flutter 中的 InheritedWidget【英文标题】:Why do I need an InheritedWidget in Flutter为什么我需要 Flutter 中的 InheritedWidget 【发布时间】:2021-03-16 16:29:40 【问题描述】:

我已经开始了解 Flutter 的继承小部件,我有一个问题。 如果我们可以从 context.findAncestorOfExactType 获取数据,为什么还需要 InheritedWidget? 还有那个 updateShouldNotify... 就像,当某些条件为真时它会通知子小部件,并且它们无论如何都会在 InheritedWidget 更改后运行其构建方法,因为它是不可变的,我们只能在某些重建中对其进行更改...

【问题讨论】:

你的意思是 findAncestorWidgetOfExactType 吗? @bluenile 是 findAncestorWidgetOfExactType 和 findAncestorStateOfType 【参考方案1】:

InheritedWidget 对于构建方法的情况更有用。当您想从构建方法中的祖先获取数据时。

来自 Flutter API:https://api.flutter.dev/flutter/widgets/BuildContext/findAncestorStateOfType.html

这不应该在构建方法中使用,因为构建上下文 如果此方法返回的值将不会被重建 变化。一般来说,dependOnInheritedWidgetOfExactType 比较多 适合此类情况。这种方法对于改变 以一次性方式的祖先小部件的状态,例如,导致 一个祖先滚动列表,用于将此构建上下文的小部件滚动到 查看或移动焦点以响应用户交互。

此外,通过执行您提到的操作,您将小部件耦合在一起,这根本不是一个好习惯。众所周知,小部件无需太多修改即可从一个地方移动到另一个地方。

继承的小部件有很多有用的东西。其中一些是非常有用的包,我建议你看看它们。

Provider package InheritedWidget & InheritedModel Redux BLoC / Rx GetIt

你也可以看看InheritedWidget documentation

【讨论】:

您能否举个代码示例,在其中我们将更新某些小部件中的值,但它的子级(或其子级的子级,无论如何它应该是小部件,它位于树的下方) 不会用新的价值重建吗?我试过像我说的那样做一些例子,但每次子小部件都是用它的祖先的新值重建的(值是从 context.findWidgetOfExactType() 传递的)

以上是关于为啥我需要 Flutter 中的 InheritedWidget的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Flutter 中的 Form 需要 GlobalKey?

为啥我的 Flutter 应用中的 FAB 很大?

为啥我在 Flutter 中使用 Firestore 中的 foreach 方法后得到空值?

为啥 Flutter 运行需要永远?

为啥 Flutter 中的 BloCListener 不保存状态,认证过程中出现 setState() 问题?

Flutter - DEBUG 中的 Webview 正在工作,但在 RELEASE apk 上显示为空白,为啥?