0Pricing
Android Academy · Урок

Предоставление состояния из 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 — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужен ViewModel
  2. Предоставление состояния из ViewModel
  3. Жизненный цикл Android
  4. collectAsStateWithLifecycle
← Назад к Android Academy