Основы Compose
Composable-функции, состояние, рекомпозиция, модификаторы
Compose описывает интерфейс через composable-функции. Изменение наблюдаемого состояния может инвалидировать читающий его участок; рекомпозиция повторно выполняет соответствующую часть композиции. Чтение состояния в layout или drawing может потребовать только эту фазу, без рекомпозиции. Фазы Compose.
Состояние
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
@Composable
fun Greeting() {
var name by remember { mutableStateOf("") }
Column {
TextField(value = name, onValueChange = { name = it })
Text("Привет, $name")
}
}
mutableStateOf создаёт наблюдаемое значение; при стандартной политике запись равного по == значения не считается изменением. remember удерживает значение в позиции композиции до выхода или изменения ключей. Для сохранения небольшого UI state через пересоздание Activity используют rememberSaveable, с ограничениями saved state. State, сохранение.
State hoisting
Компонент получает value и onValueChange, а владелец хранит состояние. Выбирайте ближайшего общего владельца для читателей и писателей; это не всегда ViewModel. Один источник значения предотвращает расхождение локальной и внешней копий. State hoisting.
Модификаторы
Modifier.padding(16.dp).background(Color.Red) размещает padding вне цветной области; обратный порядок включает отступ в фон. Положение clickable также определяет область взаимодействия. Порядок Modifier.
Побочные эффекты
Запуск корутин и подписок требует effect API. LaunchedEffect(key) отменяется и перезапускается при смене ключа, отменяется при выходе из композиции. Постоянный ключ означает один запуск на вхождение, а не один запуск за жизнь приложения. Effects.
Strong skipping включён по умолчанию с Kotlin 2.0.20: restartable-функции могут пропускаться и с unstable-параметрами. Это не делает List стабильным и не превращает мутацию обычного списка в наблюдаемое изменение. Strong skipping, stability contract.