为啥我需要 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 中使用 Firestore 中的 foreach 方法后得到空值?