← Назад к вопросам

Для чего нужна ViewModel в MVVM?

1.3 Junior🔥 261 комментариев
#Архитектура и паттерны#Жизненный цикл и навигация

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

ViewModel в архитектуре MVVM

Основная роль

ViewModel — это компонент архитектуры, который хранит и управляет UI-состоянием независимо от жизненного цикла Activity/Fragment. Она служит мостом между моделью (бизнес-логикой) и представлением (UI).

Главные функции ViewModel

  1. Сохранение состояния при пересоздании Activity

    • При повороте экрана Activity пересоздаётся
    • ViewModel остаётся в памяти
    • Данные не теряются
  2. Управление UI-состоянием

    • Хранение текущих данных
    • Управление потоком данных через LiveData/StateFlow
    • Реактивные обновления UI
  3. Инкапсуляция бизнес-логики

    • Отделение логики от UI-кода
    • Тестируемость компонентов
    • Переиспользование логики

Архитектура MVVM

View (Activity/Fragment)
  ↓
ViewModel (UI Logic + State)
  ↓
Model (Business Logic, Repository, Database)

Пример с LiveData

class UserViewModel : ViewModel() {
    private val _userState = MutableLiveData<User>()
    val userState: LiveData<User> = _userState
    
    private val _isLoading = MutableLiveData(false)
    val isLoading: LiveData<Boolean> = _isLoading
    
    fun loadUser(userId: Int) {
        viewModelScope.launch {
            _isLoading.value = true
            try {
                val user = userRepository.getUser(userId)
                _userState.value = user
            } finally {
                _isLoading.value = false
            }
        }
    }
}

Пример в View

class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels()
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
        viewModel.userState.observe(viewLifecycleOwner) { user ->
            displayUser(user)
        }
        
        viewModel.loadUser(123)
    }
}

Преимущества ViewModel

  • Устойчивость к пересоданию Activity/Fragment
  • Разделение ответственности между слоями
  • Упрощение тестирования бизнес-логики
  • Избежание утечек памяти через правильный scope
  • Централизованное управление состоянием

ViewModel vs Activity/Fragment

Не должно быть в ViewModel:

  • Прямых ссылок на Activity/Fragment (утечка памяти)
  • Получения Context через getApplication()
  • Манипуляции View напрямую

Для Context используй:

  • AndroidViewModel (передаёт Application)
  • Dependency Injection (Hilt, Koin)

Жизненный цикл ViewModel

ViewModel создана → Activity пересоздаётся → ViewModel сохраняется
                                    ↓
                       Пользователь закрывает экран
                                    ↓
                           ViewModel уничтожена

ViewModel живёт дольше, чем View, что позволяет безопасно сохранять состояние.

Для чего нужна ViewModel в MVVM? | PrepBro