我有这个:

  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: ....

我正在考虑的另一种方式是能够引用父脚手架来显示快餐栏.

怎样才能做到这一点呢?

为什么人们甚至不能在弗利特的任何地方直接调用snackbar,强制它必须通过脚手架来完成?为什么?

推荐答案

您应该尽量避免使用GlobalKey;使用Scaffold.of获取ScaffoldState几乎总是更好.由于您的菜单位于小部件树中脚手架的下方,因此Scaffold.of(context)将执行您想要的操作.

你试图做的事情不起作用的原因是你正在创建两个独立的GlobalKeys,每个GlobalKeys都是它自己的对象.把它们想象成全局指针——因为你要创建两个不同的指针,它们指向不同的东西.州政府的分析应该失败,因为你把错误的类型传递到抽屉的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'));
},

Flutter相关问答推荐

我遇到了一个问题,从showDialogue()调用Navigator.pop()两次导致屏幕空白

如何更新文本字段的基础上的选定下拉菜单?

为什么要在值列表中两次放入空安全性

在Flutter 中实现中小型应用程序栏标题

如何将Visual Studio代码中Flutter 应用的包名从com.example.XXX更改为Play Store中受限制的包名称

如何在应用程序中使用Fflight显示表情包

如何将assets资源 实体类型转换为文件类型?

如何使文本表格域在抖动中变圆?

如何处理平台游戏的对象冲突?

NotifierProvider 每次更新都会重新构建并且值不更新

Flutter 火焰相机抖动已弃用

PreferredSizeWidget类不能用作混合,因为它既不是混合类也不是混合

Flutter url_launcher 插件抛出java.lang.IllegalArgumentException:接收器未注册:io.flutter.plugins.urllauncher.WebViewActivity

如何删除图像边框半径与其父容器边框半径之间的空白

面对Flutter 中的行和列问题

当项目较少时收缩列表视图

如何在 flutter 中制作这种类型的扩展瓦片

如何按键在 map 列表中搜索

Flutter Firestore 数据库排序最近 24 小时内最喜欢的文档

Flutter Web Responsiveness 效率不高