Как закрыть панель навигации при автоматическом возврате с определенного экрана во флаттер?

Я работаю над проектом флаттера, в котором есть панель навигации с тремя маршрутами. Каждый раз, когда я иду по определенному маршруту и ​​возвращаюсь, панель навигации открывается автоматически. Я хочу, чтобы панель навигации оставалась закрытой до тех пор, пока пользователь специально не нажмет на нее. Есть ли способ добиться этого?

Вот мой код:

      class NavList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: ListView(
        padding: EdgeInsets.zero,
        children: <Widget>[
          UserAccountsDrawerHeader(
            decoration: BoxDecoration(
                image: DecorationImage(
              image: AssetImage('images/orange.png'),
              fit: BoxFit.cover,
            )),
            arrowColor: Colors.deepOrangeAccent[700],
            accountName: Text(''),
            accountEmail: Text(
              'username@gmail.com',
              style: TextStyle(
                fontWeight: FontWeight.bold,
                fontSize: 20.0,
              ),
            ),
            currentAccountPicture: CircleAvatar(
              radius: 22.0,
              backgroundColor: Colors.deepOrangeAccent[700],
              backgroundImage: AssetImage('images/profile.png'),
            ),
          ),
          ListItems(
            listTitle: 'Shops',
            listIcon: Icon(Icons.shop),
            listFunction: () {
              Navigator.pushNamed(context, ShopScreen.id);
            },
          ),
          ListItems(
            listTitle: 'Orders',
            listIcon: Icon(Icons.monetization_on),
            listFunction: () {
              Navigator.pushNamed(context, OrderScreen.id);
            },
          ),
          ListItems(
            listTitle: 'Logout',
            listIcon: Icon(Icons.logout),
            listFunction: () {
              Navigator.pushNamed(context, LoginScreen.id);
            },
          ),
        ],
      ),
    );
  }
}

I have refactored ListItems.

class ListItems extends StatelessWidget {
  ListItems({this.listTitle, this.listIcon, this.listFunction});
  final String listTitle;
  final Icon listIcon;
  final Function listFunction;

  @override
  Widget build(BuildContext context) {
    return ListTile(
      title: Text(listTitle),
      leading: IconButton(
        icon: listIcon,
        onPressed: () {
          
        },
      ),
      onTap: listFunction,
    );
  }
}

3 ответа

Решение

Есть несколько способов сделать это, например:

      onPressed:(){
   Navigator.pop(context);
   Navigator.pushNamed(context, ShopScreen.id);
 }

или используйте .then навигатора:

      onPressed:(){
   Navigator.pushNamed(context, ShopScreen.id).then((val){
   Navigator.pop(context);
  });
 }

Кроме того, вы можете проверить, открыт ли ящик в данный момент или нет:

      onPressed:(){
   Navigator.pushNamed(context, ShopScreen.id).then((val){
    if(Scaffold.of(context).isDrawerOpen){
     Navigator.pop(context);
     }
   });
  }

Я не проверял это. Может это сработает

      onPressed: () async {
   await Navigator.pushNamed(
      context, "Screen").then((value) =>
       Scaffold.of(context).openEndDrawer());
   },

Это может вам помочь

      onPressed: () {
                  Navigator.pop(context);
                 Navigator.of(context).pushNamed('/settings');
              }
Другие вопросы по тегам