Предоставление состояния из ViewModel
Управляйте пользовательским интерфейсом Compose из ViewModel
«Предоставление состояния из ViewModel» — бесплатный урок Android Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.
Предоставление состояния пользовательскому интерфейсу
ViewModel хранит состояние, но пользовательскому интерфейсу нужен способ наблюдать за ним и повторно отображаться при изменениях.
В современном Android для этого часто используются два инструмента: StateFlow и State Compose.
Шаблон изменяемого и неизменяемого состояния
Рекомендуется хранить закрытое изменяемое резервное свойство и предоставлять открытую доступную только для чтения версию.
Это не позволяет пользовательскому интерфейсу случайно изменять состояние напрямую.
Предоставление состояния через StateFlow
Используйте внутри MutableStateFlow, а наружу предоставляйте доступный только для чтения StateFlow.
class CounterViewModel : ViewModel() {
private val _count = MutableStateFlow(0)
val count: StateFlow<Int> = _count.asStateFlow()
fun increment() {
_count.value++
}
}Сбор StateFlow в Compose
Composable преобразует поток в состояние Compose с помощью collectAsState() (или варианта с учётом жизненного цикла, который рассматривается далее).
@Composable
fun CounterScreen(vm: CounterViewModel) {
val count by vm.count.collectAsState()
Text("Count: " + count)
}Почему StateFlow требует начального значения
StateFlow всегда содержит текущее значение. Поэтому при создании ему необходимо задать начальное значение.
Каждый новый сборщик немедленно получает последнее значение, а не пустой поток.
Альтернатива: mutableStateOf в Compose
Для простого состояния, локального для экрана, внутри ViewModel также можно использовать Compose mutableStateOf, за которым Compose наблюдает автоматически.
class CounterViewModel : ViewModel() {
var count by mutableStateOf(0)
private set
fun increment() { count++ }
}StateFlow и состояние Compose
- StateFlow является частью корутин Kotlin и работает не только в Compose. Он отлично подходит для общих потоков с учётом жизненного цикла.
- mutableStateOf предназначен только для Compose и очень лаконичен.
В больших приложениях для ViewModels обычно предпочитают StateFlow.
Моделирование состояния экрана одним объектом
Вместо множества отдельных потоков объединяйте связанные поля в один класс данных состояния пользовательского интерфейса. Это делает обновления атомарными и предсказуемыми.
data class ProfileUiState(
val name: String = "",
val isLoading: Boolean = false,
val error: String? = null
)Предоставление объекта состояния пользовательского интерфейса
Предоставьте один StateFlow этого класса состояния. Пользовательский интерфейс получает все данные из единого источника истины.
private val _uiState = MutableStateFlow(ProfileUiState())
val uiState: StateFlow<ProfileUiState> =
_uiState.asStateFlow()Обновление неизменяемого состояния
Обновляйте состояние, создавая copy с изменёнными полями, а не изменяя старый объект.
fun load() {
_uiState.update { it.copy(isLoading = true) }
// ... fetch, then:
_uiState.update {
it.copy(isLoading = false, name = "Ada")
}
}События поднимаются вверх, состояние спускается вниз
Это основа однонаправленного потока данных:
- Состояние передаётся вниз от ViewModel к пользовательскому интерфейсу.
- События передаются вверх от пользовательского интерфейса к ViewModel через вызовы функций.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли, как предоставлять состояние.
Повторение
Вы узнали:
- Храните приватный
MutableStateFlow, а наружу предоставляйте доступный только для чтенияStateFlow. - Объединяйте связанные поля в классе данных состояния пользовательского интерфейса.
- Обновляйте состояние с помощью
copy()черезupdate {}. - Состояние передаётся вниз, а события — вверх.
Часто задаваемые вопросы
Урок «Предоставление состояния из ViewModel» бесплатный?
Да — полный текст урока «Предоставление состояния из ViewModel» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.
Чему я научусь в уроке «Предоставление состояния из ViewModel»?
Управляйте пользовательским интерфейсом Compose из ViewModel Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Предоставление состояния из ViewModel»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужен ViewModel
- Предоставление состояния из ViewModel
- Жизненный цикл Android
- collectAsStateWithLifecycle