dart - Flutter 从不同的 dart 文件访问父 Scaffold

标签 dart flutter

我有这个:

  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/

相关文章:

flutter - 如何在列内添加 rive 动画?

dart - 将bwu-datagrid的高度设置为动态

flutter/Dart : get_cli add more controller to a page

android - json_extract for in android in flutter 不工作

flutter - 在AppBar上导致错误地存在于不同页面上

flutter - Flutter将分隔线添加到ListTile

android - 新 Flutter 项目的 `Unresolved reference: android`

android - 为什么 Google Flutter 中底部导航栏中的类似项目的文本大小不同?

highcharts - 如何在 Flutter 应用中使用 HighCharts dart 库?

flutter - 字符串包含列表的属性内部