BuildContext在Flutter中做什么?
问题内容:
会BuildContext
做什么,我们会从中得到什么信息?
https://docs.flutter.io/flutter/widgets/BuildContext-
class.html
尚不清楚。
https://flutter.io/widgets-intro/#basic-widgets在该词的第9个实例中BuildContext
有一个示例,但尚不清楚其用法。它是令我迷惑的一大堆代码的一部分,因此我很难理解到底BuildContext
是什么。
有人可以用简单/非常基本的术语来解释吗?
问题答案:
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)
都会自动重建。
很棒吧?