Ответ
Go Router — это популярный, мощный и декларативный пакет для маршрутизации (навигации) в Flutter-приложениях. Он служит заменой стандартному Navigator, предлагая удобный API для работы со сложной навигацией, глубокими ссылками и защитой маршрутов.
Базовый пример настройки:
final _router = GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => const HomeScreen(),
),
GoRoute(
path: '/profile/:userId',
builder: (context, state) {
final userId = state.pathParameters['userId']!;
return ProfileScreen(userId: userId);
},
),
GoRoute(
path: '/settings',
builder: (context, state) => const SettingsScreen(),
routes: [
// Вложенный маршрут
GoRoute(
path: 'theme',
builder: (context, state) => const ThemeSettingsScreen(),
),
],
),
],
// Редирект для проверки аутентификации
redirect: (context, state) {
final isLoggedIn = AuthService.isLoggedIn;
final goingToLogin = state.matchedLocation == '/login';
if (!isLoggedIn && !goingToLogin) return '/login';
if (isLoggedIn && goingToLogin) return '/';
return null; // Разрешить навигацию
},
);
// В MaterialApp
MaterialApp.router(
routerConfig: _router,
);
Ключевые возможности Go Router:
- Декларативная конфигурация маршрутов в одном месте.
- Глубокие ссылки (deeplinking) — работа с URL из браузера или push-уведомлений.
- Защита маршрутов через логику
redirect(например, для аутентификации). - Вложенная навигация для организации сложных UI (например, вкладок с собственным стеком).
- Удобная передача параметров через
state.pathParametersиstate.uri.queryParameters.
Навигация:
context.go('/profile/123'); // Замена всего стека
context.push('/settings/theme'); // Добавление поверх стека
GoRouter.of(context).pop(); // Назад