Какие сложности возникали при работе с Compose
Что проверяют
Вопрос про реальный опыт, а не про определения. Интервьюер ждёт конкретных граблей: где падала производительность, как ловили лишние рекомпозиции, как уживались с View-кодом. По ответу видно, писали ли вы экраны сами или читали про Compose. Следом спрашивают, чем вы это диагностировали.
Как отвечать
Берите две-три ситуации из практики и разбирайте по схеме: симптом, диагностика, решение.
- лишние рекомпозиции: нестабильные параметры (обычный
ListвместоImmutableListиз kotlinx-collections-immutable, типы из чужих модулей). Strong skipping включён по умолчанию с Kotlin 2.0.20 и снимает часть случаев, но незапомненные лямбды по-прежнему ломают пропуск; - отложенное чтение состояния: часто меняющееся значение читается внутри
Modifier.offset { },graphicsLayerили лямбды-параметра, а не в теле composable. Тогда работает только layout или draw; - списки:
keyиcontentTypeвLazyColumn, иначе прокрутка пересобирает элементы; - измерения: Layout Inspector со счётчиком рекомпозиций, composition tracing, Macrobenchmark. Замер в debug-сборке бесполезен, разница с release после R8 кратная;
- интероп:
ComposeViewв XML иAndroidViewнаоборот, а вRecyclerViewобязательнаViewCompositionStrategy.DisposeOnDetachedFromWindowOrReleasedFromPool, иначе композиции текут; - состояние и эффекты:
rememberSaveableпереживает смерть процесса,collectAsStateWithLifecycleвместоcollectAsStateдля потоков ViewModel,rememberUpdatedStateдля лямбды внутри долгогоLaunchedEffect,derivedStateOfтолько там, где производное значение меняется реже исходного.
Добавьте организационную сложность: поэтапная миграция, смешанные экраны, обучение команды, перевод дизайн-системы на Material 3.
Где спотыкаются
Говорят «сложностей не было». Это читается как отсутствие опыта: Compose стабилен, но острых углов хватает.
Расставляют remember и derivedStateOf везде подряд как оберег. derivedStateOf на значении, которое меняется вместе с исходным, только добавляет накладные расходы.
Рассказывают про оптимизацию без цифр. Назовите, что мерили: число рекомпозиций, кадры в Macrobenchmark, jank в Play Console.