0Pricing
Android Academy · Урок

Зачем нужен ViewModel

Корректно сохраняйте состояние при изменениях конфигурации

«Зачем нужен ViewModel» — бесплатный урок Android Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Что такое ViewModel

ViewModel — это компонент архитектуры Android, предназначенный для хранения и управления данными, связанными с пользовательским интерфейсом, с учётом жизненного цикла.

Он переживает изменения конфигурации, например поворот экрана, поэтому данные не уничтожаются и не создаются заново каждый раз, когда система перестраивает пользовательский интерфейс.

Проблема изменения конфигурации

При повороте устройства Android уничтожает и создаёт заново Activity. Любое состояние, хранящееся внутри Activity или Composable, теряется.

  • Счётчик сбрасывается до нуля.
  • Загруженный список исчезает.
  • Сетевой запрос может начаться заново.

ViewModel решает эту проблему, существуя вне жизненного цикла экземпляра Activity.

Как ViewModel сохраняется

Среда выполнения сохраняет тот же экземпляр ViewModel при пересоздании. Когда создаётся новая Activity, ей передаётся существующий ViewModel, а не новый.

class CounterViewModel : ViewModel() {
    var count = 0
        private set

    fun increment() {
        count++
    }
}

Получение ViewModel в Compose

В Jetpack Compose обычно получают ViewModel с помощью вспомогательной функции viewModel(). Она возвращает тот же экземпляр для владельца жизненного цикла.

import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun CounterScreen(
    vm: CounterViewModel = viewModel()
) {
    Text("Count: " + vm.count)
}

Разделение ответственности

ViewModel помогает чётко разделить обязанности:

  • Слой пользовательского интерфейса (Composables/Activities) только отображает состояние и передаёт события.
  • ViewModel хранит состояние и бизнес-логику.

Благодаря этому пользовательский интерфейс становится проще, а логику легче тестировать.

Область действия и владелец ViewModel

Область действия ViewModel ограничена объектом ViewModelStoreOwner, которым обычно является Activity, Fragment или запись стека возврата навигации.

Он автоматически очищается, когда этот владелец окончательно уничтожается, например когда пользователь закрывает Activity кнопкой «Назад».

Обратный вызов onCleared

Когда ViewModel окончательно уничтожается, среда выполнения вызывает onCleared(). Используйте его для освобождения открытых ресурсов.

class MyViewModel : ViewModel() {
    override fun onCleared() {
        super.onCleared()
        // cancel jobs, close listeners
    }
}

Что НЕ следует помещать в ViewModel

Никогда не храните ссылки на Views, Activities или Context, связанный с пользовательским интерфейсом, внутри ViewModel. Поскольку ViewModel живёт дольше Activity, это приводит к утечкам памяти.

Если Вам нужен контекст приложения, используйте AndroidViewModel.

AndroidViewModel для контекста приложения

Если Вам действительно нужен Context, унаследуйте класс от AndroidViewModel, который безопасно предоставляет долгоживущий контекст приложения.

class PrefsViewModel(
    app: Application
) : AndroidViewModel(app) {
    private val context = getApplication<Application>()
}

Передача аргументов конструктора

Чтобы внедрить зависимости, например репозиторий, в ViewModel, используйте ViewModelFactory или платформу DI, например Hilt. Hilt рассматривается далее в этом курсе.

class UserViewModel(
    private val repo: UserRepository
) : ViewModel() {
    // repo provided via a factory or Hilt
}

Почему ViewModel важен

ViewModel — основа современной архитектуры Android. Он обеспечивает:

  • Сохранение состояния при изменениях конфигурации.
  • Чёткое разделение пользовательского интерфейса и логики.
  • Предсказуемое состояние, удобное для тестирования.

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете, зачем используются ViewModels.

Повторение

Вы узнали, что:

  • ViewModel хранит состояние пользовательского интерфейса и переживает изменения конфигурации.
  • Он никогда не должен хранить ссылки на View или Activity, чтобы избежать утечек.
  • Его область действия ограничена владельцем, а очистка выполняется через onCleared().
  • AndroidViewModel предоставляет безопасный Context приложения.

Часто задаваемые вопросы

Урок «Зачем нужен ViewModel» бесплатный?

Да — полный текст урока «Зачем нужен ViewModel» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «Зачем нужен ViewModel»?

Корректно сохраняйте состояние при изменениях конфигурации Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Зачем нужен ViewModel»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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