Навигация и ресурсы в общем UI

Когда UI общий, общими становятся и навигация, и ресурсы — но с оговорками.

Compose Resources — механизм Compose Multiplatform для хранения общих строк, изображений и шрифтов в одном месте с доступом из общего кода.

Навигация: общая или нативная

В классическом KMP навигация — платформенная: на Android NavController, на iOS — NavigationStack. В Compose Multiplatform навигацию тоже можно сделать общей: появилась мультиплатформенная навигация (порт Navigation Compose), управляющая стеком экранов в общем коде. Это удобно, но не обязательно: можно держать общими экраны, а переходы — нативными.

// commonMain с Compose Multiplatform навигацией
NavHost(navController, startDestination = "list") {
    composable("list") { OrderListScreen(onOpen = { id -> navController.navigate("detail/$id") }) }
    composable("detail/{id}") { OrderDetailScreen() }
}

Общие ресурсы

Строки локализации, иконки, шрифты в Compose Multiplatform хранят в общем модуле (composeResources) и обращаются к ним из общего кода:

Text(stringResource(Res.string.order_title))
Image(painterResource(Res.drawable.logo), contentDescription = null)

Так локализация и ассеты не дублируются между платформами.

Как работает под капотом

Плагин Compose Multiplatform генерирует типобезопасный класс Res по содержимому каталога ресурсов: каждая строка и картинка становятся свойством. В рантайме на Android ресурсы могут лечь в нативную систему ресурсов, на iOS — упаковаться во фреймворк и читаться оттуда. Навигация под капотом — это держатель стека записей (back stack) в общем коде; платформенная кнопка «назад» проксируется в этот стек. То есть и навигация, и ресурсы следуют общему принципу: единая модель в общем коде, платформенная подложка под ней.

Граница разумного

Не всё стоит делать общим даже при общем UI. Глубокая интеграция с системной навигацией iOS (свайп-назад, крупные заголовки) или Android (предиктивный back-жест) иногда требует нативных вставок. Здравый подход: общий UI и навигация для основной массы экранов, нативные точки там, где нужно идеальное системное поведение.

Частые ошибки

Дублировать строки локализации в Android- и iOS-проектах при том, что есть общие composeResources. Вторая ошибка — тащить в общую навигацию платформенно-специфичные переходы, теряя нативные жесты. Третья — забыть, что в классическом (не Compose) KMP навигация остаётся нативной, и не пытаться её «обобщить» без Compose Multiplatform.

Итоги

  • В Compose MP навигация и ресурсы могут быть общими; в классическом KMP — нативные.
  • Общие ресурсы (строки, картинки) убирают дублирование локализации.
  • Плагин генерирует типобезопасный доступ к ресурсам через Res.
  • Для идеального системного поведения навигации иногда нужны нативные вставки.
Проверьте себя
1. Какая навигация в классическом (не Compose) KMP?
AВсегда общая
BПлатформенная: NavController на Android, NavigationStack на iOS
CТолько через web
DОтсутствует
2. Что даёт механизм Compose Resources?
AУскоряет сеть
BХранит общие строки и изображения с типобезопасным доступом из общего кода
CЗаменяет базу данных
DГенерирует API-клиент