Навигация и ресурсы в общем 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. - Для идеального системного поведения навигации иногда нужны нативные вставки.