我正尝试了解有关BuildContext
和Scaffold.of()
的更多信息。
我了解到,当您显示SnackBar
时,通常需要添加一个Builder
才能使上下文位于添加的脚手架下方。
因此:
class MyScreen extends StatelessWidget {
build(BuildContext context) {
return Scaffold(
body: Builder(
builder: (context) =>
RaisedButton(
child: Text('push me'),
onPressed: () => Scaffold.of(context).showSnackBar(
SnackBar(content: Text('this will work'))),
),
));
}
}
我的问题是这样的:如果Scaffold.of()
得到最接近的祖先,通常它最终是否不应该在小部件树的上方找到更高的东西? SplashScreen支架?
当我们拿走构建器并创建此错误代码时:
class MyScreen extends StatelessWidget {
build(BuildContext context) {
return Scaffold(
body: RaisedButton(
child: Text('push me'),
onPressed: () => Scaffold.of(context).showSnackBar(
SnackBar(content: Text('broken'))),
),
));
}
}
然后我们得到标准错误
Scaffold.of() called with a context that does not contain a Scaffold.
I/flutter ( 7750)
No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of().
即使BuildContext
中没有直接的父代脚手架,怎么也找不到脚手架的祖先(例如祖父母祖先)?我的应用程序中的所有先前页面都有一个脚手架,它们不再位于小部件树中吗?
我知道,如果找到了脚手架并渲染了SnackBar,我们将无法看到它,但是我仍然不明白它是如何找不到的。也许我误解了“祖先”的含义。
谢谢
答案 0 :(得分:0)
Execute
表示一个特定窗口小部件在窗口小部件树中的位置。
这样,根据您使用的BuildContext
,呼叫BuildContext
的行为可能会有所不同。
在您的以下示例中:
Scaffold.of(context)
在这里,您正在使用class MyScreen extends StatelessWidget {
build(BuildContext context) {
return Scaffold(
body: RaisedButton(
child: Text('push me'),
onPressed: () => Scaffold.of(context).showSnackBar(
SnackBar(content: Text('this will work'))),
),
),
);
}
}
中的BuildContext
。问题是MyScreen
是创建 MyScreen
的窗口小部件。因此,Scaffold
是MyScreen
的祖先,无法通过Scaffold
访问它。