← Назад к вопросам
Для чего нужна ViewModel в MVVM?
1.3 Junior🔥 261 комментариев
#Архитектура и паттерны#Жизненный цикл и навигация
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
ViewModel в архитектуре MVVM
Основная роль
ViewModel — это компонент архитектуры, который хранит и управляет UI-состоянием независимо от жизненного цикла Activity/Fragment. Она служит мостом между моделью (бизнес-логикой) и представлением (UI).
Главные функции ViewModel
-
Сохранение состояния при пересоздании Activity
- При повороте экрана Activity пересоздаётся
- ViewModel остаётся в памяти
- Данные не теряются
-
Управление UI-состоянием
- Хранение текущих данных
- Управление потоком данных через LiveData/StateFlow
- Реактивные обновления UI
-
Инкапсуляция бизнес-логики
- Отделение логики от 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, что позволяет безопасно сохранять состояние.