Ответ вслух Junior Compose: композиция и рекомпозиция обновлено

Декларативный UI против View

Вопрос

Чем декларативный Compose отличается от императивной системы View? Какие плюсы и минусы?

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

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

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

Коротко

В системе View я создаю объекты один раз и потом вручную меняю их: textView.text = ..., view.isVisible = .... Состояние размазано между данными и view, и легко забыть обновить что-то, получив рассинхрон.

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

  • UI как функция от состояния, а не ручные изменения View

  • Нет синхронизации состояния View и данных вручную

  • Меньше кода: нет XML, адаптеров, findViewById

  • Переиспользование через функции и модификаторы

  • Минусы: рекомпозиции и стабильность, порог входа, размер и прогрев

  • Интероп: ComposeView и AndroidView для постепенной миграции

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

  • Как мигрировать большой проект на Compose?
  • Как Compose работает с темами Material 3?

Разбор

В системе View я создаю объекты один раз и потом вручную меняю их: textView.text = ..., view.isVisible = .... Состояние размазано между данными и view, и легко забыть обновить что-то, получив рассинхрон. В Compose UI описывается функцией от состояния: я пишу, как экран выглядит для текущего UiState, а фреймворк сам сравнивает и обновляет изменившиеся части. Кода меньше: нет XML, адаптеров RecyclerView, findViewById, а переиспользование это просто функции и модификаторы. Анимации и темы проще. Минусы тоже есть: нужно понимать рекомпозицию и стабильность, иначе легко получить тормоза, первый запуск без Baseline Profile медленнее, а часть старых библиотек есть только как View. Миграцию делаю постепенно: новые экраны на Compose, старые view встраиваю через AndroidView, а Compose в старые экраны через ComposeView.

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

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