The imperative Navigator.push falls apart once you need deep links, web URLs, or auth-based redirects. go_router gives Flutter a declarative, URL-first router that handles all of it.
Defining Routes
final router = GoRouter(
routes: [
GoRoute(path: '/', builder: (_, __) => const HomeScreen()),
GoRoute(
path: '/product/:id',
builder: (_, state) => ProductScreen(id: state.pathParameters['id']!),
),
],
);Auth Redirects in One Place
GoRouter(
redirect: (context, state) {
final loggedIn = authService.isLoggedIn;
if (!loggedIn && state.uri.path != '/login') return '/login';
return null; // no redirect
},
routes: [ /* ... */ ],
);Navigating
context.go('/product/42'); // replace
context.push('/settings'); // push onto the stackFree Deep Links and Web URLs
Because routes are real paths, deep links from notifications and shareable web URLs work with zero extra code. StatefulShellRoute handles bottom-nav tab state too.
