Search code examples
dartflutterdrawerscaffoldsetstate

How to hide drawer in flutter after changing Scaffold.body value


I am using the method in this question to change the body of a Scaffold in flutter:

Flutter Drawer Widget - change Scaffold.body content

The method described works perfectly. Now I would like just the drawer to automatically close after the users taps on one of the items.

I tried using the Navigator.pop() method, but it pops the entire screen, not just the drawer. It leaves me with a totally black screen.

Any suggestions?


Solution

  • Are you using exactly Navigator.of(context).pop()? I cannot reproduce your problem, can you post a minimal example to reproduce it?

    The following code works as expected: the settings button pops away the drawer, while the other don't.

    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => new _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      String text = "Initial Text";
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
            drawer: new Drawer(
              child: new ListView(
                children: <Widget>[
                  new Container(child: new DrawerHeader(child: new Container())),
                  new Container (
                    child: new Column(
                        children: <Widget>[
                          new ListTile(leading: new Icon(Icons.info),
                              onTap:(){
                                setState((){
                                  text = "info pressed";
                                });
                              }
                          ),
                          new ListTile(leading: new Icon(Icons.save),
                              onTap:(){
                                setState((){
                                  text = "save pressed";
                                });
                              }
                          ),
                          new ListTile(leading: new Icon(Icons.settings),
                              onTap:(){
                                setState((){
                                  text = "settings pressed";
                                });
                                Navigator.of(context).pop();
                              }
                          ),
    
                        ]
                    ),
                  )
                ],
              ),
            ),
            appBar: new AppBar(title: new Text("Test Page"),),
            body: new Center(child: new Text((text)),
            ));
      }
    }