Почему я начал делать собственный роутер для 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 раз (из них только один раз мной)! Присоединяйтесь: