#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. да, я исправил проблему, и теперь она заменяет страницы, но когда я вношу изменения на домашней странице и перехожу на вторую страницу, а затем возвращаюсь на домашнюю страницу, изменения не сохраняются, как будто я открыл страницу в первый раз.