会BuildContext做什么,我们会从中得到什么信息?
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')。
Navigator.of(context).pushNamed('myRoute')
注意这里的上下文。它将用于获取NavigatorState树中上方最接近的小部件实例。然后pushNamed在该实例上调用该方法。
NavigatorState
pushNamed
很酷,但是 我 什么时候要使用它?
当您想要向下传递数据 而 不必手动将其分配给每个小部件时,BuildContext确实有用。配置例如; 您将需要在任何地方访问它们。但是您不想在每个构造函数上传递它。
您可能会创建一个整体或一个单例;但是当conf更改时,您的小部件将不会自动重建。
在这种情况下,请使用InheritedWidget。有了它,您可能会编写以下内容:
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)都会自动重建。
inheritFromWidgetOfExactType(Configuration)
很棒吧?