我在顶部有一个StatefulWidget(我们将其称为顶部小部件),其构建功能如下所示:
@override
Widget build(BuildContext context) {
return new MaterialApp(
color: // some color,
theme: // some theme,
home: new Scaffold(
backgroundColor: // some color,
body: new Builder(builder: (context) {
_builderContext = context;
return new Column(
children: <Widget>[
new Expanded(
child: new MaterialApp(
color: // some color,
theme: // some theme,
title: 'title',
onGenerateRoute: _onRoute,
navigatorKey: _navigatorState,
navigatorObservers: observers,
),
),
... etc
现在,在_onRoute生成的子窗口小部件中的某个位置,我想用showModalBottomSheet(context, ...)
来显示一个底页。但是,传递给showModalBottomSheet的上下文必须是上述构建方法中来自Builder的上下文。如果我使用孩子可用的上下文,则工作表会在用户界面的错误底部锚点弹出。现在,孩子已经可以通过GlobalKey与顶部小部件进行通信了。但是,在顶部小部件的另一种方法中,我只能访问其一般上下文。将此上下文传递给showModalBottomSheet会引发空指针。
经过大量研究和反复试验,我想出的唯一解决方案是将上下文缓存在构建方法(_builderContext = context;
)中,然后使用此缓存的上下文将其传递给另一个实例中的showModalBottomSheet顶部小部件方法:
openBottomSheet() {
if (_builderContext != null) {
showModalBottomSheet(
context: _builderContext,
builder: (context) {
return // some bottom sheet content;
});
}
}
就目前而言,这似乎工作得很好,但是我想知道是否有更清洁的方法来做到这一点?
这个问题可以概括为我一般如何访问子小部件中的上下文。我试着想出一个InheritedWidget解决方案,但无法真正思考如何使Builder成为继承的小部件,然后将其用于我的问题。
任何想法都值得赞赏。
答案 0 :(得分:0)
如果此问题仅用于使用ModalBottomSheet,我强烈建议您使用Flushbar Plugin here进行颤动。它具有安静的灵活性,您可以在很大程度上自定义它,而不必照顾上下文和其他内容,可以根据需要对其进行编辑,即使您没有脚手架祖先,也可以在任何地方使用它。在使用底部模态板或脚手架时,需要脚手架祖先。
如果此问题仅与在父小部件中的子小部件中使用上下文有关,我建议您将其简单地传递给任何class/widget(stateful/stateless)
作为参数。它使一切安静易于使用。