就像它的名字所暗示的那样,BuildContext是构建特定小部件的上下文。

如果你曾经做过一些反应之前,这种背景有点类似的反应的背景(但更顺利地使用) ; 有一些奖金。

一般来说,上下文有两种用例:

  • 与父母互动(主要是获取/发布数据)
  • 一旦在屏幕上渲染,得到您的屏幕大小和位置

第二点是比较少见的。另一方面,第一点几乎在任何地方都被使用。

例如,当您想要推送一条新路线时,您将执行 Navigator.of(context).pushNamed('myRoute')

注意这里的上下文。它将用于获取树中最接近的 NavigatorState小部件实例。然后对该实例调用方法 pushNamed


很好,但是 什么时候要用呢?

当您想要向下传递数据时,BuildContext 非常有用,例如,必须手动将数据分配给每个小部件的配置; 您需要在任何地方访问它们。但是您不希望将它传递给每个构造函数。

您可能会创建一个全局或单例模式; 但是当 cons 发生更改时,您的小部件不会自动重新构建。

在这种情况下,您可以使用 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 对象/上下文是什么?

在了解 BuildCotext 之前,我们必须了解 Element 对象。

什么是 Element 对象

(注意: 作为一个 flutter 开发人员,我们从来没有使用 Element 对象,但是我们使用了一个类似 Element 对象的对象(称为 BuildContext 对象)

Element 对象是当前小部件的 建造位置

“建造位置”到底是什么意思?

  1. 当框架通过调用构造函数构建一个小部件对象时,相应地需要为该小部件对象创建一个元素对象。
  1. 这个元素对象表示该小部件的构建位置。
  1. 这个元素对象有许多有用的实例方法。

谁使用 Element 对象及其方法?

它们是使用 Element 对象及其方法的02个方面。

  1. 框架(创建 RenderObject 树等)
  2. 开发者(像我们一样)

BuildContext 对象是什么?

BuildContext 对象实际上是 Element 对象。

因此,BuildContext object = discouraged element object(与原始 Element 对象相比,它包含更少的实例方法)

为什么框架不鼓励 Element 对象并将其传递给我们?

因为 Element 对象的实例方法只能由框架本身使用。 但是当我们使用这些方法时会发生什么,这是不应该做的事情。 这就是为什么框架不鼓励 Element 对象并将其传递给我们的原因



好,现在我们来谈谈这个话题

BuildContext 对象在 Flutter 中做什么?

BuildContext 对象有几个有用的方法,可以轻松地执行需要在小部件树中完成的某些任务。

  1. ().

    返回给定类型 T 的最近祖先小部件。

  2. ().

    返回最接近的祖先状态部件的 State 对象。

  3. ().

    获取给定类型 T 的最接近的小部件,该小部件必须是具体 Heritage itedWidget 子类的类型,并用该小部件注册此生成上下文,以便在该小部件发生更改时。 [由提供程序包使用]

如果您希望看到 BuildContext 对象的所有方法都访问这个 链接 + 请参阅@remi Rousselot 的答案,那么上述方法大多是 BuildContext 对象的实例方法。