我有这个:
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: 方法 'showSnackBar' 在 null 上被调用。
一个简单的解决方案是将整个 menu.dart
内容直接放在 drawer: ...
中。
我正在研究的另一种方法是能够引用父脚手架以显示 snackbar 。
如何做到这一点?
为什么不能从 Flutter 的任何地方直接调用 snackbar ,而必须通过 Scaffold 来完成?为什么?
最佳答案
你应该尽量避免使用GlobalKey
;您几乎总是最好使用 Scaffold.of
来获取 ScaffoldState。由于您的菜单位于小部件树中的脚手架下方,因此 Scaffold.of(context)
将执行您想要的操作。
您尝试做的事情不起作用的原因是您正在创建两个单独的 GlobalKeys - 每个都是它自己的对象。将它们视为全局指针 - 因为您正在创建两个不同的指针,它们指向不同的东西。由于您将错误的类型传递到 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'));
},
关于dart - Flutter 从不同的 dart 文件访问父 Scaffold,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51253630/