BuildContext
是指一个特定widget被构建的上下文。类似于React的context,但更易用且具有一些额外的优点。通常来说,有两种使用情况:
- 与父widget交互(主要是获取/发送数据)
- 渲染完成后获取屏幕尺寸和位置
第二个点比较少见。而第一个点则几乎在任何地方都会用到。例如,当你想要推送一个新路由时,你会这样做:
Navigator.of(context).pushNamed('myRoute')
。
注意上述代码中的context。它将被用来获取树中最近的
NavigatorState
widget实例,然后调用该实例上的
pushNamed
方法。
那么什么时候需要使用BuildContext呢?当你想要向下传递数据而不必手动为每个widget的配置分配数据时,BuildContext非常有用。你希望随处都能访问它们,但不想在每个构造函数中都传递数据。
你可以潜在地创建一个全局或单例;但是当配置发生变化时,你的widgets不会自动重建。在这种情况下,你可以使用
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(
),
),
);
}
感谢此举,现在 无论何处 在您的应用内,您都可以使用 BuildContext
访问这些配置。通过这样做
final configuration = context.inheritFromWidgetOfExactType(Configuration)
更酷的是,调用inheritFromWidgetOfExactType(Configuration)
的所有小部件将在配置更改时自动重建。
很棒吧?