Весь проект на Kotlin Compose
Что проверяют
За фразой обычно стоит проверка, правда ли у вас был проект целиком на Jetpack Compose или несколько экранов внутри XML-приложения. Интервьюер хочет понять глубину: как устроены состояние, навигация и производительность. Следом просят рассказать про самую неприятную проблему с рекомпозицией или про миграцию старых экранов.
Как отвечать
Говорите про свой проект и со своими цифрами: сколько экранов, сколько человек в команде, был ли легаси. Каркас:
- масштаб: весь UI на Compose или гибрид. Если гибрид, как стыковали:
ComposeViewво фрагментах,AndroidViewдля старых вьюх вроде карты или WebView; - состояние: однонаправленный поток данных,
StateFlowво ViewModel, сбор черезcollectAsStateWithLifecycle(), state hoisting,rememberиrememberSaveableдля локального состояния; - навигация: Navigation Compose с типобезопасными маршрутами на
@Serializableклассах; - дизайн-система: Material 3, своя тема через
MaterialThemeиCompositionLocal; - производительность: стабильные параметры,
keyвLazyColumn,derivedStateOf, счётчики рекомпозиций в Layout Inspector, Baseline Profiles для холодного старта; - тесты:
createComposeRule()и семантические матчеры, скриншотные тесты на Paparazzi или Roborazzi.
Плюсом будет знание, что компилятор Compose с Kotlin 2.0 живёт в репозитории Kotlin и подключается плагином org.jetbrains.kotlin.plugin.compose, а режим strong skipping теперь включён по умолчанию.
Если целиком на Compose вы не работали, так и скажите: «Основное приложение на XML, новые экраны мы делали на Compose, вот что я на них решал». Честный гибрид ценится выше выдуманного «всё на Compose», которое рассыпается на втором уточнении.
Где спотыкаются
Называют фреймворк «Kotlin Compose» и путают Jetpack Compose с Compose Multiplatform. Мелочь, но выдаёт поверхностное знакомство.
Не могут объяснить, почему экран перерисовывается лишний раз: передают нестабильные List и лямбды, читают состояние слишком высоко в дереве.
Делают тяжёлую работу прямо в composable: запросы, сортировку, создание объектов без remember. Этому место во ViewModel или в LaunchedEffect.