BuildContext 在 Flutter 中做了啥?
Posted
技术标签:
【中文标题】BuildContext 在 Flutter 中做了啥?【英文标题】:What does BuildContext do in Flutter?BuildContext 在 Flutter 中做了什么? 【发布时间】:2018-08-12 12:03:27 【问题描述】:BuildContext
做了什么,我们从中得到了什么信息?
https://docs.flutter.io/flutter/widgets/BuildContext-class.html 只是不清楚。
https://flutter.io/widgets-intro/#basic-widgets 在术语BuildContext
的第9 个实例中有一个示例,但不清楚它是如何使用的。它是我迷失的更大代码集的一部分,所以我很难理解 BuildContext
是什么。
有人可以用简单/非常基本的术语解释一下吗?
【问题讨论】:
Flutter YouTube 官方频道已发布视频解释它here。 【参考方案1】:BuildContext
就像它的名字所暗示的那样,是构建特定小部件的上下文。
如果你以前做过一些 React,那么这个上下文有点类似于 React 的上下文(但使用起来更流畅);有一些奖金。
一般来说,上下文有 2 个用例:
与父母互动(主要是获取/发布数据) 在屏幕上渲染后,获取您的屏幕尺寸和位置第二点比较少见。另一方面,几乎所有地方都使用第一点。
例如,当您要推送新路由时,您将执行Navigator.of(context).pushNamed('myRoute')
。
注意这里的上下文。它将用于获取树中最接近的NavigatorState
小部件实例。然后在该实例上调用方法pushNamed
。
很酷,但是我什么时候想要使用它?
BuildContext 在您想要向下传递数据时非常有用 不必手动将其分配给每个小部件的配置,例如;你会想在任何地方访问它们。但是您不想将它传递给每个构造函数。
您可能会创建一个全局或单例;但是当 confs 更改时,您的小部件不会自动重建。
在这种情况下,您使用InheritedWidget
。有了它,您可能会编写以下内容:
class Configuration extends InheritedWidget
final String myConf;
const Configuration(this.myConf, Widget child): super(child: child);
@override
bool updateShouldNotify(Configuration oldWidget)
return myConf != oldWidget.myConf;
然后,这样使用它:
void main()
runApp(
new Configuration(
myConf: "Hello world",
child: new MaterialApp(
// usual stuff here
),
),
);
多亏了这一点,现在在您的应用程序中无处不在,您可以使用BuildContext
访问这些配置。通过做
final configuration = context.inheritFromWidgetOfExactType(Configuration);
更酷的是 所有 调用 inheritFromWidgetOfExactType(Configuration)
的小部件将在配置更改时自动重建。
很棒吧?
【讨论】:
谢谢。澄清一下,您提到它可以让您与父母互动。在您的示例中,BuildContext 似乎正在与包含 BuildContext 的小部件的子级交互。我看对了吗? 有什么方法可以在 build() 方法之外访问所述 InheritedWidget?没有上下文。如果我想使用数据,请在 initState() 中说? 您需要上下文才能访问它。但是您可以访问initState
中的上下文。
initState
怎么样?每次我输入context
我都会得到红色的波浪线:)
@Jus10 不应该是这样。您仍然可以获得context
,但它不是有效的BuildContext
,因为build()
尚未运行。【参考方案2】:
什么是 BuildContext 对象/上下文?
在了解 BuildCotext 之前,我们必须了解 Element 对象。
什么是元素对象
(注意:作为 Flutter 开发者,我们从未使用过 Element 对象,但我们使用了一个类似于 Element 对象的对象(称为 BuildContext 对象)
Element 对象是当前小部件的构建位置。
“构建位置”的真正含义是什么?
当框架通过调用其构造函数来构建一个小部件对象时,将相应地需要为该小部件对象创建一个元素对象。
这个元素对象代表了那个小部件的构建位置。
这个元素对象有很多有用的实例方法。
谁使用 Element 对象及其方法?
他们是使用 Element 对象及其方法的 02 方。
框架(用于创建 RenderObject 树等) 开发者(像我们一样)
什么是 BuildContext 对象?
BuildContext 对象实际上是 Element 对象。 BuildContext 接口用于阻止对 Element 对象的直接操作。
所以BuildContext object = discouraged element object
(与原始 Element 对象相比,它包含的实例方法数量更少)
为什么框架不鼓励 Element 对象并将其传递给我们?
因为 Element 对象具有实例方法,而这些实例方法必须只有框架本身需要。 但是当我们通过我们访问这些方法时会发生什么,这是不应该做的事情。 那么framework之所以不鼓励Element对象并把它传递给我们
好的,现在让我们谈谈这个话题
BuildContext 对象在 Flutter 中有什么作用?
BuildContext 对象有几个有用的方法可以轻松执行需要在小部件树中完成的某些任务。
-
findAncestorWidgetOfExactType()。
findAncestorStateOfType()。返回给定类型 T 的最近的祖先部件。
dependOnInheritedWidgetOfExactType()。返回最近的祖先 StatefulWidget 的 State 对象。
获取给定类型 T 的最近小部件,它必须是具体 InheritedWidget 子类的类型,并将此构建上下文注册到该小部件,以便当该小部件更改时。 [提供者包使用]
以上方法多为 BuildContext 对象的实例方法,如果你想查看该 BuildContext 对象的所有方法,请访问LINK + 查看@remi Rousselot 的答案。
【讨论】:
很好的答案!谢谢! :)) 你为什么在第 1 点和第 2 点写findAncestorWidgetOfExactType
?
@Aleksandar 哦!这是一个错误,我纠正了它。谢谢以上是关于BuildContext 在 Flutter 中做了啥?的主要内容,如果未能解决你的问题,请参考以下文章
Flutter中的参数类型'Widget Function(BuildContext)'不能分配给参数类型'Widget Function(BuildContext,Widget)'错误