BuildContext:最接近的含义是什么?

时间:2019-05-07 17:07:02

标签: flutter

我正在阅读文档:https://docs.flutter.io/flutter/widgets/BuildContext-class.html

  

这可能会导致一些棘手的情况。例如,Theme.of(context)查找给定构建上下文中最接近的 enclosing 主题。 ...

包含是否包含当前上下文的主题?我不明白作者指出的棘手情况。

1 个答案:

答案 0 :(得分:1)

如果您理解前面的陈述,他们提到的棘手情况将变得更加清楚:

  

特别是,这意味着在构建方法中,该构建方法的窗口小部件的构建上下文与该构建方法返回的窗口小部件的构建上下文不同。

好吧,不是一种很有帮助的语言。想象一下:

FooWidgetA:
属性:上下文,高度,宽度
方法:构建

FooWidgetB:
属性:上下文,主题
方法:构建

FooWidgetB内置在FooWidgetA build方法中。如果您尝试使用theme中的context查找FooWidgetA,则不会找到,因为FooWidgetA在窗口小部件树的上方。

因此,举例说明他们的棘手情况,它看起来像这样:

class Foo extends StatelessWidget {
  @override
  Widget build(BuildContext buildMethodContext) {
    return MaterialApp(
      // Here we create the [ThemeData] that our method below will try to find
      theme: ThemeData(primaryColor: Colors.orange),
      builder: (BuildContext materialAppContext, _) {
        return RaisedButton(
          child: const Text('Get ThemeData'),
          onPressed: () {
            getThemeData(buildMethodContext);  // unsucessful
            getThemeData(materialAppContext);  // sucessful
          },
        );
      },
    );
  }

  ThemeData getThemeData(BuildContext context) => Theme.of(context);
}

之所以棘手,是因为由于两个上下文都可以关闭,因此很容易忘记buildMethodContext实际上是来自父级(Foo)的,因此看不到materialAppContext。 / p>