我正在阅读文档:https://docs.flutter.io/flutter/widgets/BuildContext-class.html
这可能会导致一些棘手的情况。例如,Theme.of(context)查找给定构建上下文中最接近的 enclosing 主题。 ...
包含是否包含当前上下文的主题?我不明白作者指出的棘手情况。
答案 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>