Flutter Drawer 多次导航到同一个页面
Flutter Drawer navigate to a single page multiple times
当我拉动抽屉和 select 导航到它的页面时,就像创建一个新实例一样,例如,如果我在同一页面上单击 4 次,它会显示打开新页面的动画当我按 phone.
的后退按钮时,页面 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()));
},
),
],
),
);
}
}
根据您的代码,您正在初始化当前屏幕顶部的 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:
}
}
这将替换现有抽屉式导航屏幕中的屏幕。
请确认这是否是您遇到的问题。谢谢。
只需将 Navigator.push
替换为 Navigator.pushReplacement
并删除 Navigator.pop
它将用新屏幕替换当前屏幕。它会解决你的问题。
要详细了解,只需查看此文档:
https://docs.flutter.io/flutter/widgets/Navigator/pushReplacement.html
当我拉动抽屉和 select 导航到它的页面时,就像创建一个新实例一样,例如,如果我在同一页面上单击 4 次,它会显示打开新页面的动画当我按 phone.
的后退按钮时,页面 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()));
},
),
],
),
);
} }
根据您的代码,您正在初始化当前屏幕顶部的 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:
}
}
这将替换现有抽屉式导航屏幕中的屏幕。
请确认这是否是您遇到的问题。谢谢。
只需将 Navigator.push
替换为 Navigator.pushReplacement
并删除 Navigator.pop
它将用新屏幕替换当前屏幕。它会解决你的问题。
要详细了解,只需查看此文档: https://docs.flutter.io/flutter/widgets/Navigator/pushReplacement.html