Всплывающий ящик позволяет несколько раз переходить на одну страницу

#flutter #flutter-layout

#всплывающий #всплывающий макет

Вопрос:

когда я выдвигаю ящик и выбираю страницу для перехода, это похоже на создание нового экземпляра этого, например, если я нажал на одну и ту же страницу 4 раза, она показывает анимацию открытия новой страницы 4 раза и то же самое, когда я нажимаю кнопку «Назад» на телефоне.

   new ListTile(
        leading: Icon(Icons.home),
        title: new Text("Home"),
        onTap: () {
          Navigator.pop(ctxt);
          Navigator.push(
              ctxt, new MaterialPageRoute(builder: (ctxt) => MyHomePage()));
        },
  

вот файл ящика, который я использую на всех страницах

 class DrawerOnly extends StatelessWidget {
  @override
  Widget build(BuildContext ctxt) {
    return new Drawer(
      child: new ListView(
        children: <Widget>[
          new UserAccountsDrawerHeader(
            accountName: new Text('Fethi'),
            accountEmail: new Text('Myemail@Mail.com'),
            currentAccountPicture: new CircleAvatar(
              backgroundImage: new NetworkImage('http://i.pravatar.cc/300'),
          ),
        ),
      new ListTile(
        leading: Icon(Icons.home),
        title: new Text("Home"),
        onTap: () {
          Navigator.pushReplacement(
              ctxt, new MaterialPageRoute(builder: (ctxt) => MyHomePage()));
        },
      ),
      new ListTile(
        leading: Icon(Icons.note),
        title: new Text("ADD Notes"),
        onTap: () {
          Navigator.pushReplacement(
              ctxt, new MaterialPageRoute(builder: (ctxt) => EditNote()));
        },
      ),
    ],
  ),
);
  

}
}

Комментарии:

1. пожалуйста, покажите свой полный код

2. это слишком длинный человек, это часть, вызывающая проблему.

Ответ №1:

Просто замените Navigator.push на Navigator.pushReplacement и удалите Navigator.pop

Это заменит текущий экран новым экраном. И это решит вашу проблему.

Чтобы узнать подробности, просто ознакомьтесь с этой документацией: https://docs.flutter.io/flutter/widgets/Navigator/pushReplacement.html

Комментарии:

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

2. имеет ли это отношение к базе данных?

3. Да, это заменит текущую страницу на новую, которую вы применяете. И это не имеет отношения к базе данных.

4. итак, как я могу вернуться на старую страницу без потери данных?

Ответ №2:

Согласно вашему коду, вы инициализируете MyHomePage экран поверх текущего экрана (запускаете новый экран). В навигации по ящику вам нужно заменить body: экранами, которые вы хотите отобразить.

Пример :

Возьмите переменную типа

   int selectionScreen = 0;
  

вы можете использовать это в соответствии с вашими потребностями, я взял int . Теперь, основываясь на этом, вы можете выбрать, какой экран вы хотите показать.

 new Scaffold(
        appBar: new AppBar(
          // here we display the title corresponding to the fragment
          // you can instead choose to have a static title
          title: new Text("Drawer navigation"),
        ),
        drawer: new Drawer(
          child: new Column(
            children: <Widget>[
              new ListTile(
                  leading: Icon(Icons.home),
                  title: new Text("Home"),
                  onTap: () {
                    setState(() {
                      selectionScreen = 0;
                    });
                    Navigator.pop(context);
                  })
            ],
          ),
        ),
        body: _getScreen(selectionScreen));
  

Теперь вы можете использовать его _getScreen() для получения нескольких экранов по мере добавления новых ListTile в список ящиков.

 _getScreen(int selection) {
    switch (selection) {
      case 0:
        return MyHomePage();

      case 1:
        return Screen2();
      default:
    }
  }
  

Это заменит экраны на существующем экране навигации ящика.

Пожалуйста, подтвердите, была ли это проблема, с которой вы столкнулись. Спасибо.

Комментарии:

1. да, я исправил проблему, и теперь она заменяет страницы, но когда я вношу изменения на домашней странице и перехожу на вторую страницу, а затем возвращаюсь на домашнюю страницу, изменения не сохраняются, как будто я открыл страницу в первый раз.