微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在抽屉中使用DrawerControllerState?

如何解决如何在抽屉中使用DrawerControllerState?

最小代码

void main() => runApp(MaterialApp(home: MainPage()));

class MainPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),drawer: MyDrawer(),);
  }
}

class MyDrawer extends StatelessWidget {
  final _drawerKey = GlobalKey<DrawerControllerState>();

  @override
  Widget build(BuildContext context) {
    return Drawer(
      key: _drawerKey,child: RaisedButton(
        onpressed: () => print(_drawerKey.currentState),// Prints null
        child: Text('Show Dialog'),),);
  }
}

当我按下按钮时,它会打印null,那么使用DrawerControllerState的正确方法是什么?

解决方法

看,问题在于您没有正确使用key。首先,为了获得Drawer的状态,您需要拥有ScaffoldState而不是DrawerControllerState类型的密钥。

使用ScaffoldState.currentState,您将获取数据。另外,如果您想查看抽屉是打开还是关闭。您可以像这样使用它:

ScaffoldState.currentState.isDrawerOpen

有两种方法可以做到这一点:

1。夸张地声明GlobalKey以便在任何地方访问它

void main() => runApp(MaterialApp(home: MainPage()));

// declare it globally or make your drawer inside the MainPage only
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

class MainPage extends StatelessWidget {
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,// <-- Use your key here not for drawer
      appBar: AppBar(),drawer: MyDrawer(),);
  }
}

class MyDrawer extends StatelessWidget {
  
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: RaisedButton(
        onPressed: () => print(_scaffoldKey.currentState.isDrawerOpen),// <-- prints true,when open
        child: Text('Show Dialog'),)
    );
  }
}

2。将抽屉仅放在MainPage内。易于访问

class MainPage extends StatelessWidget {
  
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
  
  Drawer get _drawer => Drawer(
    child: RaisedButton(
      onPressed: () => print(_scaffoldKey.currentState.isDrawerOpen),// <-- prints true when opened
      child: Text('Show Dialog'),)
  );
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,// <-- Using Key for Scaffold
      appBar: AppBar(),drawer: _drawer
    );
  }
}

GlobalKeyMainPage传递到MyDrawer将无济于事。你可以玩。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。