Navigation3
Перетащил свою kmp-поделку на новую библиотеку навигации от гугла. Для приложения на 7 экранов процесс занял 1 час.
Начиналась навигация с переходов между активити с помощью интентов. Потом single-activity + фрагменты. Потом Cicerone. Потом Navigation Component с XML-графами. Потом Navigation Compose. Потом эта же навигация стала Type safe.
И вот теперь мы здесь.
Сегодня котируется подход practice-first, когда сначала код за тебя пишет агент, а уже потом ты разбираешь теорию, чтобы запомнить её через опыт, а не абстрактные определения.
В гугле это осознали и выкатили инструкцию для LLM, как мигрировать с 2 версии навигации на 3. Все что требуется – запустить агента и подождать несколько минут. Я попробовал Gemini 3 Pro в Android Studio и ChatGPT 5 в Codex. Обе справились почти на отлично. Нейросеть от гугла больше понимает за андроид-проекты, а не за kmp. Даже зависимости подключила android-only. В проект влил ветку, созданную в Codex.
Отдельное спасибо агенту, что сообразил обновить koin-модули вьюмоделей, так как в новой навигации больше нет удобного получения аргументов из SavedStateHandle.
Приложение запускается и тыкается. Что пришлось поменять:
• У метода NavDisplay три перегрузки и агент взял ту, где напрямую не используется back stack. Я хоть новостей и не читал, но перед глазами мелькали релизноуты как удобно там экраны добавлять через .add и удалять через .removeLastOrNull. Поэтому поменял перегрузку и управление стеком.
• Агент забыл привязать жизненный цикл ViewModel к entry, а не ко всему NavHost. Добавил rememberViewModelStoreNavEntryDecorator.
• В Nav2 при жесте назад по умолчанию использовалась fade-анимация. Вернул ее в Nav3, переопределив predictivePopTransitionSpec. Новая анимация по умолчанию пока слишком кривая.
Хороший пример kmp-проекта на Nav3 – официальное приложение kotlin-konf. Многим оттуда вдохновился.
Теперь, когда все сделано, можно начинать изучать, что нового в этой навигации. И потом мигрировать проект посложнее.
Post #313
503
- ❤ 1