我有这个:
final GlobalKey<ScaffoldState> _scaffoldkey = new GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: Scaffold(
key: _scaffoldkey,
drawer: Menu(),
appBar: AppBar(
title: Container(
child: Text('Dashboard'),
),
bottom: TabBar(
tabs: <Widget>[
...
],
),
),
body: TabBarView(
children: <Widget>[
...
],
),
),
);
}
}
现在,从另一个
drawer: Menu()
文件导入menu.dart
,如下所示:class Menu extends StatelessWidget {
final GlobalKey<ScaffoldState> drawerKey = new GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
return new Drawer(
key: drawerKey,
child: new ListView(
children: <Widget>[
new ListTile(
dense: true,
title: new Text('My Text'),
onTap: () {
// On tap this, I want to show a snackbar.
scaffoldKey.currentState.showSnackBar(showSnack('Error. Could not log out'));
},
),
],
),
);
}
}
通过以上方法,我得到
NoSuchMethodError: The method 'showSnackBar' was called on null.
一个简单的解决方案是将整个
menu.dart
内容直接塞入drawer: ...
中。我正在查看的另一种方法是能够引用父支架以显示小吃栏。
一个人怎么能做到这一点?
为什么甚至不能只在Flutter的任何地方打电话给快餐店,而必须通过脚手架来完成呢?只是为什么
最佳答案
您应尽量避免使用GlobalKey
;使用Scaffold.of
来获取ScaffoldState几乎总是更好。由于您的菜单位于小部件树中的支架下方,因此Scaffold.of(context)
将执行您想要的操作。
您尝试执行的操作不起作用的原因是,您要创建两个单独的GlobalKey-每个都有自己的对象。将它们视为全局指针-由于您要创建两个不同的指针,因此它们指向不同的事物。由于您将错误的类型传递到了Drawer的key
字段中,因此状态确实应该失败了……
如果由于某些原因绝对必须使用GlobalKeys,最好将外部小部件中创建的实例作为成员(即Menu
)传递到this.scaffoldKey
类中,但是不建议这样做。
使用Scaffold.of
,这就是您的代码在onTap函数中的样子:
onTap: () {
// On tap this, I want to show a snackbar.
Scaffold.of(context).showSnackBar(showSnack('Error. Could not log out'));
},