我有这个:

  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'));
},

10-07 18:45