Ответ вслух Middle Compose: композиция и рекомпозиция спрашивают часто обновлено

Рекомпозиция и производительность Compose

Вопрос

Объясни, как работает рекомпозиция в Compose и как ты боролся с лишними рекомпозициями.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Compose следит, какие State прочитала каждая composable. Когда значение меняется, рантайм повторно вызывает только эти функции, а при вызове детей сравнивает параметры: если все стабильны и равны прошлым, ребёнок пропускается.

Что должно прозвучать в ответе

  • Рекомпозиция вызывается изменением прочитанного State

  • Skipping: стабильные и равные параметры позволяют пропустить функцию

  • Стабильность: неизменяемые классы, ImmutableList, @Immutable

  • Чтение быстро меняющегося состояния в фазе layout или draw через лямбды модификаторов

  • derivedStateOf и remember для вычислений, key в списках

  • Диагностика: Layout Inspector, отчёты компилятора, проверка в release

Что могут спросить следом

  • Что изменил Strong Skipping?
  • Почему debug-сборка Compose медленнее?

Разбор

Compose следит, какие State прочитала каждая composable. Когда значение меняется, рантайм повторно вызывает только эти функции, а при вызове детей сравнивает параметры: если все стабильны и равны прошлым, ребёнок пропускается. Поэтому производительность упирается в стабильность и в то, где читается состояние. Я делаю UI-модели неизменяемыми data class с val, списки передаю как ImmutableList или помечаю обёртки @Immutable, не создаю новые объекты в теле на каждой рекомпозиции. Быстро меняющиеся значения вроде скролла и анимаций читаю в лямбдах Modifier.offset { } или graphicsLayer { }, тогда меняется только layout или отрисовка без рекомпозиции. Для значений, которые меняются реже источника, использую derivedStateOf, а в LazyColumn всегда задаю key. Ищу проблемы Layout Inspector со счётчиками рекомпозиций и отчётами компилятора, а меряю в release-сборке, потому что debug Compose заметно медленнее. Со Strong Skipping стало проще, но новые ссылки всё равно ломают пропуск.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.