Почему я начал делать собственный роутер для Flutter

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

Строковые пути, dynamic и словари параметров работают — но по мере роста приложения становятся источником ошибок.

Особенно когда появляются: — несколько веток с bottom bar и независимой историей переходов; — сохранение состояния при переключении между ветками; — экраны, которые должны открываться поверх всего интерфейса; — авторизация как отдельный линейный flow; — deep links при холодном и тёплом старте; — корректная обработка системной кнопки Back; — программный сброс навигации из сервисов без BuildContext.

Мне хотелось, чтобы маршрут был обычным типизированным объектом: const ProductRoute(productId: 42) Чтобы обязательные параметры находились в его полях, builder сразу получал конкретный тип, а публичные методы навигации не принимали строковые пути.

Да, типизированный подход уже используется в auto_route. Но он, как и go_router, не подходит мне по ряду архитектурных и практических причин. О них я отдельно напишу позже.

Так появился pioneer_router — пакет поверх стандартного Flutter Navigator 2.0.

Каждый роутер в нём владеет собственным стеком. Ветки shell-навигации сохраняют своё состояние, между ними можно переходить по типизированному маршруту, а неоднозначные конфигурации не разрешаются случайным образом — пакет явно сообщает об ошибке.

Deep links преобразуются в типизированные маршруты только на внешней границе приложения. Обычная программная навигация при этом остаётся полностью типизированной.

Я также постарался сохранить привычную семантику Navigator: push, pop, replace, pushReplacement, типизированные результаты переходов, popToRoot и полный reset состояния. Это не попытка сделать копию go_router или объявить существующие решения неправильными. Скорее, это другой набор компромиссов: строгая типизация маршрутов, независимые роутеры, явное управление shell-ветками и минимум скрытого поведения.

Сейчас вышла первая альфа-версия. API ещё может меняться, но основные сценарии уже работают и покрыты тестами

Тем временем пакет скачан уже 77 раз (из них только один раз мной)! Присоединяйтесь:

https://pub.dev/packages/pioneer_router