Как скрыть ящик в флаттере после изменения значения Scaffold.body

Я использую метод в этом вопросе, чтобы изменить тело скаффолда в флаттере:

Flutter Drawer Widget - изменить содержимое Scaffold.body

Описанный метод работает отлично. Теперь я хотел бы, чтобы ящик автоматически закрывался после того, как пользователи нажимают на один из элементов.

Я попытался использовать метод Navigator.pop(), но он выскакивает весь экран, а не только ящик. Это оставляет меня с абсолютно черным экраном.

Какие-либо предложения?

4 ответа

Решение

Вы используете именно Navigator.of(context).pop()? Я не могу воспроизвести вашу проблему, можете ли вы опубликовать минимальный пример для ее воспроизведения?

Следующий код работает должным образом: кнопка настроек выскакивает из ящика, а другая - нет.

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)),
        ));
  }
}

Создать scaffoldKey

закрыть ящик

 _scaffoldKey.currentState.openEndDrawer(),

открытый ящик

scaffoldKey.currentState.openDrawer(),

пример

     InkWell(
        onTap: ()=> widget.scaffoldKey.currentState.openDrawer(),
        child: Icon(
          Icons.menu,
          size: 38,
          color: Color(0xFFFFFFFF),
        ),
      ), 

Если вы используете MaterialApp, вам нужно использовать Scaffold.of(context).openEndDrawer(), так что вам не нужно создавать GlobalKey.

class Menu extends StatelessWidget {
  const Menu({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ListView(
      padding: EdgeInsets.zero,
      children: [
        FlatButton(
          onPressed: () {
            Navigator.of(context).pushNamed('/');
            Scaffold.of(context).openEndDrawer();
          },
          child: ListTile(
            leading: Icon(Icons.home),
            title: Text('Home'),
          ),
        ),
        FlatButton(
          onPressed: () {
            Navigator.of(context).pushNamed('/about');
            Scaffold.of(context).openEndDrawer();
          },
          child: ListTile(
            leading: Icon(Icons.question_answer),
            title: Text('About'),
          ),
        ),
      ],
    );
  }
}

Просто:

      ListTile(
  title: const Text('Item 1'),
  onTap: () {
    // Update the state of the app
    // ...
    // Then close the drawer
    Navigator.pop(context);
  },
),
Другие вопросы по тегам