drawer: fixed navigation stack when opening setttings/about/debug

This commit is contained in:
Thibault Deckers 2020-09-05 10:10:09 +09:00
parent 994acc81f8
commit 385a8ee430
2 changed files with 17 additions and 7 deletions

View file

@ -208,6 +208,7 @@ class _AppDrawerState extends State<AppDrawer> {
Widget get settingsTile => NavTile( Widget get settingsTile => NavTile(
icon: AIcons.settings, icon: AIcons.settings,
title: 'Settings', title: 'Settings',
topLevel: false,
routeName: SettingsPage.routeName, routeName: SettingsPage.routeName,
pageBuilder: (_) => SettingsPage(), pageBuilder: (_) => SettingsPage(),
); );
@ -215,6 +216,7 @@ class _AppDrawerState extends State<AppDrawer> {
Widget get aboutTile => NavTile( Widget get aboutTile => NavTile(
icon: AIcons.info, icon: AIcons.info,
title: 'About', title: 'About',
topLevel: false,
routeName: AboutPage.routeName, routeName: AboutPage.routeName,
pageBuilder: (_) => AboutPage(), pageBuilder: (_) => AboutPage(),
); );
@ -222,6 +224,7 @@ class _AppDrawerState extends State<AppDrawer> {
Widget get debugTile => NavTile( Widget get debugTile => NavTile(
icon: AIcons.debug, icon: AIcons.debug,
title: 'Debug', title: 'Debug',
topLevel: false,
routeName: DebugPage.routeName, routeName: DebugPage.routeName,
pageBuilder: (_) => DebugPage(source: source), pageBuilder: (_) => DebugPage(source: source),
); );

View file

@ -9,6 +9,7 @@ class NavTile extends StatelessWidget {
final IconData icon; final IconData icon;
final String title; final String title;
final Widget trailing; final Widget trailing;
final bool topLevel;
final String routeName; final String routeName;
final WidgetBuilder pageBuilder; final WidgetBuilder pageBuilder;
@ -16,6 +17,7 @@ class NavTile extends StatelessWidget {
@required this.icon, @required this.icon,
@required this.title, @required this.title,
this.trailing, this.trailing,
this.topLevel = true,
@required this.routeName, @required this.routeName,
@required this.pageBuilder, @required this.pageBuilder,
}); });
@ -42,14 +44,19 @@ class NavTile extends StatelessWidget {
onTap: () { onTap: () {
Navigator.pop(context); Navigator.pop(context);
if (routeName != context.currentRouteName) { if (routeName != context.currentRouteName) {
Navigator.pushAndRemoveUntil( final route = MaterialPageRoute(
context, settings: RouteSettings(name: routeName),
MaterialPageRoute( builder: pageBuilder,
settings: RouteSettings(name: routeName),
builder: pageBuilder,
),
settings.navRemoveRoutePredicate(routeName),
); );
if (topLevel) {
Navigator.pushAndRemoveUntil(
context,
route,
settings.navRemoveRoutePredicate(routeName),
);
} else {
Navigator.push(context, route);
}
} }
}, },
selected: context.currentRouteName == routeName, selected: context.currentRouteName == routeName,