What is the best approach to handle routing with GoRoute and ShellRoute.
I have 3 screens:
The only issue I encounter in this config is a missing back button when I go to Settings screen. How can I fix it?
final goRouter = GoRouter(
initialLocation: '/a',
navigatorKey: _rootNavigatorKey,
routes: [
GoRoute( // = Do not show Bottom Navigation, just a full screen
path: '/settings',
pageBuilder: (context, state) => const NoTransitionPage(
child: SettingsPage(),
),
),
ShellRoute( // ShellRoute = Show Bottom Navigation
navigatorKey: _shellNavigatorKey,
builder: (context, state, child) {
return ScaffoldWithBottomNavigation(
tabs: tabs,
child: child,
);
},
routes: [
GoRoute(
path: '/a',
pageBuilder: (context, state) => const NoTransitionPage(
child: HomeScreen(label: 'A', detailsPath: '/a/details'),
),
routes: [
GoRoute(
path: 'details',
builder: (context, state) => const DetailsScreen(label: 'A'),
),
],
),
GoRoute(
path: '/b',
pageBuilder: (context, state) => const NoTransitionPage(
child: HomeScreen(label: 'B', detailsPath: '/b/details'),
),
routes: [
GoRoute(
path: 'details',
builder: (context, state) => const DetailsScreen(label: 'B'),
),
],
),
],
),
],
);
context.go('/someRoute')
for pushing page to the stackparentNavigatorKey
prop of GoRoute.Use context.push('/someRoute')
to push the page to the stack, only then you can see the back button in the pushed page.
Use parentNavigatorKey
property in each route
and specify explicitly where the present GoRoute
lies .
ShellRoute
: parentNavigatorKey:_shellNavigatorKey
MainRoute
: parentNavigatorKey:_rootNavigatorKey
settings
route:GoRoute(
parentNavigatorKey:_rootNavigatorKey 👈 Specify explicity that settings page lies in the Main Route
path: '/settings',
pageBuilder: (context, state) => const NoTransitionPage(
child: SettingsPage(),
),
),
Now you will get rid of the bottomNavigationBar
which lies inside the ShellRoute
.
Refer detailed code and explaination of bottom NavigationBar using ShellRoute
and GoRouter
here