Ответ
При реализации навигации в 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, поддерживает вложенные маршруты