Что такое Jetpack Compose и почему Android переходит на него
Основы3 минРедакция Innovialabs
Коротко
Jetpack Compose — современный декларативный UI-фреймворк Android на Kotlin: вы описываете, как экран выглядит при данном состоянии, а система сама перерисовывает изменившиеся части.
Что такое Jetpack Compose
Jetpack Compose — это набор инструментов Google для построения интерфейсов Android-приложений на Kotlin. Вместо XML-разметки и ручного обновления View вы пишете функции, которые описывают интерфейс по текущему состоянию. Изменилось состояние — Compose сам обновляет нужные элементы экрана.
Google продвигает Compose как рекомендуемый способ создания UI для новых Android-приложений, а новые возможности дизайн-системы Material в первую очередь появляются именно в нём.
Императивный и декларативный подход
В классическом подходе экран описан в XML, а код находит элементы и меняет их вручную: textView.setText(...), button.setVisibility(...). Чем сложнее экран, тем легче забыть обновить какой-то элемент и получить рассинхрон.
В Compose интерфейс — это функция от состояния:
@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("Нажато: $count")
}
}
Здесь нет поиска View и ручного обновления текста. Вы меняете count, а Compose перерисовывает кнопку.
| XML + View | Jetpack Compose | |
|---|---|---|
| Где описан UI | XML-файлы и код | Только Kotlin |
| Обновление экрана | Вручную | Автоматически по состоянию |
| Списки | RecyclerView + Adapter | LazyColumn / LazyRow |
| Повторное использование | Кастомные View, include | Обычные функции |
| Превью | Layout Editor | @Preview прямо в коде |
Ключевые понятия
- Composable-функция — функция с аннотацией
@Composable, которая описывает часть интерфейса. Экраны собираются из небольших функций, как из конструктора. - Состояние (state) — данные, от которых зависит экран. Compose отслеживает чтение состояния и знает, какие части зависят от него.
- Рекомпозиция — повторный вызов composable-функций, когда их состояние изменилось. Compose старается перезапускать только те функции, которые читают изменённые данные.
- remember — сохраняет значение между рекомпозициями, чтобы оно не сбрасывалось при каждой перерисовке.
- Поднятие состояния (state hoisting) — практика выносить состояние наверх, во ViewModel или родительскую функцию, а компоненты делать «глупыми»: они получают данные и сообщают о событиях.
Совместимость со старыми экранами
Compose не требует переписывать приложение целиком. Есть два моста:
- ComposeView — вставляет Compose-интерфейс внутрь существующего XML-экрана или фрагмента.
- AndroidView — встраивает классическую View (например, карту или старый кастомный компонент) внутрь Compose.
Благодаря этому миграция идёт постепенно: новые экраны пишутся на Compose, старые переводятся, когда до них доходит очередь.
Что это значит для вашего проекта
Новый проект. Разумно сразу начинать на Compose: меньше кода, быстрее итерации с дизайнерами, проще поддерживать единый стиль. Найти разработчиков с опытом Compose становится всё проще.
Существующий проект на XML. Переписывать всё сразу обычно нецелесообразно. Рабочая стратегия:
- Подключить Compose к проекту и настроить общую тему.
- Новые экраны и фичи делать на Compose.
- Переводить старые экраны, когда их всё равно нужно серьёзно менять.
- Сложные и стабильные экраны можно оставить на XML надолго.
Частые ошибки
- Тяжёлые вычисления внутри composable-функций. Они могут вызываться часто; вычисления выносят во ViewModel или оборачивают в
remember. - Состояние в каждом компоненте. Без поднятия состояния экран сложно тестировать и отлаживать.
- Игнорирование стабильности данных. Нестабильные типы могут вызывать лишние рекомпозиции; это видно в инструментах Android Studio.
- Миграция ради миграции. Переписывание рабочего экрана без бизнес-причины тратит время и добавляет риски.