一尘不染

BuildContext在Flutter中做什么?

flutter

BuildContext做什么,我们会从中得到什么信息?

https://docs.flutter.io/flutter/widgets/BuildContext-
class.html尚不清楚。

https://flutter.io/widgets-intro/#basic-widgets在该词的第9个实例中BuildContext有一个示例,但尚不清楚其用法。它是令我迷惑的一大堆代码的一部分,因此我很难理解到底BuildContext是什么。

有人可以用简单/非常基本的术语来解释吗?


阅读 288

收藏
2020-08-13

共1个答案

一尘不染

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

如果您曾经做过一些React,那么该上下文类似于React的上下文(但使用起来更顺畅);有一些奖金。

一般而言,上下文有2个用例:

  • 与您的父母互动(主要是获取/发布数据)
  • 在屏幕上渲染后,获取屏幕尺寸和位置

第二点有点罕见。另一方面,第一点几乎在所有地方都被使用。

例如,当您想推一条新路线时,您将这样做Navigator.of(context).pushNamed('myRoute')

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


很酷,但是 什么时候要使用它?

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

您可能会创建一个整体或一个单例;但是当conf更改时,您的小部件将不会自动重建。

在这种情况下,请使用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)都会自动重建。

很棒吧?

2020-08-13