Маршрутизация в Flutter 3.x: tp_router пытается удалить вашу таблицу маршрутов (и это привлекательная идея)
tp_router это управляемый генератором роутер для Flutter, устраняющий ручные таблицы маршрутов. Аннотируйте страницы, запустите build_runner и навигируйте через типизированные API вместо строковых путей.
Маршрутизация во Flutter одна из тех вещей, которые замечаешь только когда становится больно. Первые несколько экранов даются легко. Затем приложение растёт, пути эволюционируют, и “просто добавь ещё один маршрут” превращается в налог на обслуживание. 7 января 2026 года пост сообщества предложил идейное решение: tp_router, управляемый генератором роутер, который стремится к нулю ручной конфигурации таблицы маршрутов.
Исходная тема: tp_router: Stop Writing Route Tables (r/FlutterDev)
Ссылки на проект: GitHub, pub.dev
Режим отказа: строки повсюду
Большинство команд переживало некоторую версию этого:
// Define route table
final routes = {
'/user': (context) => UserPage(
id: int.parse(ModalRoute.of(context)!.settings.arguments as String),
),
};
// Navigate
Navigator.pushNamed(context, '/user', arguments: '42');
Это “работает”, пока не перестаёт: имя маршрута меняется, тип аргумента меняется, и вы получаете крэши в runtime в частях приложения, которые не трогали.
Сначала аннотация, потом генерация
Идея tp_router проста: аннотируйте страницу, запустите генератор и затем навигируйте через сгенерированные типы вместо строк.
Из поста:
@TpRoute(path: '/user/:id')
class UserPage extends StatelessWidget {
final int id; // Auto-parsed from path
final String section;
const UserPage({
required this.id,
this.section = 'profile',
super.key,
});
}
// Navigate by calling .tp()
UserRoute(id: 42, section: 'posts').tp(context);
Эта последняя строка и есть весь смысл: если вы переименуете section или измените id с int на String, вы хотите, чтобы компилятор сломал вашу сборку, а не пользователей.
Реальный вопрос: остаётся ли низким трение по мере роста приложения?
Если вы использовали auto_route, вы уже знаете, что управляемая аннотациями маршрутизация может работать хорошо, но всё равно в итоге пишете центральный список:
@AutoRouterConfig(routes: [
AutoRoute(page: UserRoute.page, path: '/user/:id'),
AutoRoute(page: HomeRoute.page, path: '/'),
])
class AppRouter extends RootStackRouter {}
tp_router пытается удалить этот последний шаг полностью.
Запуск в проекте на Flutter 3.x
Зависимости, показанные в теме:
dependencies:
tp_router: ^0.1.0
tp_router_annotation: ^0.1.0
dev_dependencies:
build_runner: ^2.4.0
tp_router_generator: ^0.1.0
Сгенерировать маршруты:
dart run build_runner build
И подключить:
void main() {
final router = TpRouter(routes: tpRoutes);
runApp(MaterialApp.router(routerConfig: router.routerConfig));
}
Если вы хотите меньше шаблонного кода маршрутизации и больше безопасности на этапе компиляции, tp_router стоит быстрого исследовательского спайка. Даже если вы не примете его на вооружение, направление верное: рассматривайте навигацию как типизированный API, а не как строковый фольклор.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.