我有这个:
final GlobalKey_scaffoldkey = new GlobalKey (); @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: [ ... ], ), ), body: TabBarView( children: [ ... ], ), ), ); } }
现在,drawer: Menu()
将从另一个menu.dart
文件中导入,该文件如下所示:
class Menu extends StatelessWidget { final GlobalKeydrawerKey = new GlobalKey (); @override Widget build(BuildContext context) { return new Drawer( key: drawerKey, child: new ListView( children: [ 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)
将执行您想要的操作。
您尝试执行的操作不起作用的原因是,您正在创建两个单独的GlobalKeys-每个GlobalKeys是其自己的对象。将它们视为全局指针-由于您要创建两个不同的指针,因此它们指向不同的事物。由于您要将错误的类型传递到Drawer的key
字段中,因此状态实际上应该是分析失败的……
如果出于某种原因绝对必须使用GlobalKeys,最好将外部小部件中创建的实例Menu
作为成员ie 传递给您的类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')); },