Какие классы понадобятся при реализации навигации в Flutter?

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

Ответ

При реализации навигации в Flutter я работаю со следующими ключевыми классами и концепциями:

1. Navigator — центральный класс, управляющий стеком маршрутов (Route):

// Простой переход
Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => DetailsScreen(product: product)),
);

// Возврат с результатом
final result = await Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => SelectionScreen()),
);

// Возврат назад
Navigator.pop(context, {'selected': true});

2. Route и его реализации:

  • MaterialPageRoute — стандартный маршрут для Material Design
  • CupertinoPageRoute — для iOS-стиля
  • PageRouteBuilder — для кастомных анимаций переходов:
    PageRouteBuilder(
    pageBuilder: (context, animation, secondaryAnimation) => DetailsScreen(),
    transitionsBuilder: (context, animation, secondaryAnimation, child) {
    return FadeTransition(opacity: animation, child: child);
    },
    )

3. RouteSettings — хранение конфигурации маршрута:

Navigator.pushNamed(
  context,
  '/user/profile',
  arguments: UserProfileArgs(userId: 123),
);

// В целевом виджете
final args = ModalRoute.of(context)!.settings.arguments as UserProfileArgs;

4. ModalRoute — для получения информации о текущем маршруте:

final currentRoute = ModalRoute.of(context);
final isCurrent = currentRoute?.isCurrent ?? false;

5. Для именованной навигации (классический подход):

MaterialApp(
  routes: {
    '/': (context) => HomeScreen(),
    '/details': (context) => DetailsScreen(),
    '/settings': (context) => SettingsScreen(),
  },
  onGenerateRoute: (settings) {
    if (settings.name == '/user/:id') {
      final id = settings.name!.split('/').last;
      return MaterialPageRoute(
        builder: (context) => UserScreen(userId: id),
      );
    }
    return null;
  },
);

В современных проектах я часто использую пакеты для более декларативной и типобезопасной навигации:

  • go_router — популярный выбор с глубокими ссылками и guard-логикой
  • auto_route — генерация маршрутов по аннотациям, полная типобезопасность
  • beamer — основан на Router API, поддерживает вложенные маршруты