Что такое Go Router в контексте Flutter?

«Что такое Go Router в контексте Flutter?» — вопрос из категории Навигация, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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(); // Назад