代码之家  ›  专栏  ›  技术社区  ›  KhoPhi

从不同的DART文件访问父脚手架

  •  4
  • KhoPhi  · 技术社区  · 7 年前

    我有这个:

      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。

    一个人怎么能做到这一点?

    为什么人们甚至不能直接从flutter中的任何地方调用snackbar,并强制通过脚手架来完成?为什么?

    1 回复  |  直到 7 年前
        1
  •  8
  •   rmtmckenzie    7 年前

    你应该尽量避免使用 GlobalKey 尽可能多的;你用 Scaffold.of 以获得脚手架状态。因为你的菜单在小部件树的脚手架下面, Scaffold.of(context) 会做你想做的。

    你试图做的不起作用的原因是你正在创建两个独立的globalkeys-每个都是它自己的对象。把它们当作全局指针——因为你要创建两个不同的指针,它们指向不同的东西。因为你把错误的类型输入抽屉,所以状态应该是失败的 key 字段…

    如果出于某种原因必须使用globalkeys,那么最好将在外部小部件中创建的实例传递到 Menu 作为成员分类,即 this.scaffoldKey ,但不建议这样做。

    使用 脚手架 ,这是您的代码在ontap函数中的外观:

    onTap: () {
      // On tap this, I want to show a snackbar.
      Scaffold.of(context).showSnackBar(showSnack('Error. Could not log out'));
    },