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

Как реализовать ViewModel в Android?

1.7 Middle🔥 211 комментариев
#UI и вёрстка

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Реализация ViewModel в Android

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

Основные принципы реализации

ViewModel следует реализовывать, используя официальную библиотеку Android Jetpack. Основные компоненты:

  1. Класс ViewModel: Наследуется от androidx.lifecycle.ViewModel.
  2. ViewModelProvider: Фабрика для создания и управления ViewModel'ами.
  3. Жизненный цикл: ViewModel связан с жизненным циклом владельца (Scope) и переживает его конфигурационные изменения.

Базовый пример реализации

Рассмотрим создание простой ViewModel для управления счетчиком.

1. Создание класса ViewModel

import androidx.lifecycle.ViewModel

class CounterViewModel : ViewModel() {
    // LiveData для наблюдения изменений счетчика
    private val _counter = MutableLiveData<Int>()
    val counter: LiveData<Int> = _counter

    init {
        _counter.value = 0
    }

    fun increment() {
        _counter.value = (_counter.value ?: 0) + 1
    }

    // ViewModel может содержать логику очистки ресурсов
    override fun onCleared() {
        super.onCleared()
        // Освобождение ресурсов, если необходимо
    }
}

2. Использование ViewModel в Activity или Fragment

ViewModel создается через ViewModelProvider, который связывает ее с жизненным циклом владельца.

import androidx.activity.viewModels
import androidx.lifecycle.observe

class MainActivity : AppCompatActivity() {
    // Делегированное свойство 'viewModels' создает и возвращает ViewModel
    private val viewModel: CounterViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Наблюдение за LiveData и обновление UI
        viewModel.counter.observe(this) { count ->
            findViewById<TextView>(R.id.counter_text).text = "Count: $count"
        }

        findViewById<Button>(R.id.increment_button).setOnClickListener {
            viewModel.increment()
        }
    }
}

Ключевые аспекты реализации

Способы создания ViewModel

  • Делегированные свойства (by viewModels() или by activityViewModels()) — наиболее удобный и современный способ в Kotlin.
  • Через ViewModelProvider напрямую:
    val viewModel = ViewModelProvider(this).get(CounterViewModel::class.java)
    

Передача параметров в ViewModel

Для создания ViewModel с параметрами (например, ID элемента) используется ViewModelFactory.

class DetailViewModelFactory(private val itemId: String) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(DetailViewModel::class.java)) {
            return DetailViewModel(itemId) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

// Использование фабрики в Fragment
class DetailFragment : Fragment() {
    private val itemId: String by lazy { arguments?.getString("ID") ?: "" }

    private val viewModel: DetailViewModel by viewModels {
        DetailViewModelFactory(itemId)
    }
}

Архитектурные рекомендации

  • Разделение ответственности: ViewModel должна содержать данные и бизнес-логику, но не ссылки на View или контекст.
  • Использование LiveData, StateFlow или Observable для состояния UI, чтобы обеспечить реактивное и безопасное обновление.
  • Инициализация данных: Используйте init блок или методы типа loadData() для подготовки начального состояния.
  • Обработка конфигурационных изменений: Все данные в ViewModel автоматически сохраняются при повороте экрана. Для сохранения между сессиями приложения (например, после завершения процесса) используйте SavedStateHandle.
    class SavedStateViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
        val savedData: LiveData<String> = savedStateHandle.getLiveData("key", "default")
    }
    

Преимущества использования ViewModel

  • Сохранение состояния: Данные не теряются при повороте экрана.
  • Разделение архитектуры: Чистое отделение логики от UI, соответствие принципам MVVM.
  • Сокращение нагрузки на Activity/Fragment: Управление данными и бизнес-логикой вынесено из контроллеров.
  • Легкость тестирования: ViewModel можно тестировать независимо от Android-фреймворка с помощью юнит-тестов.

Таким образом, реализация ViewModel в Android предполагает создание класса, наследующего от базового ViewModel, управление состоянием через реактивные компоненты (LiveData/StateFlow) и правильное инстанцирование через ViewModelProvider с учетом жизненного цикла и возможных параметров. Этот подход является фундаментальным для построения устойчивых и maintainable приложений на Android.

Как реализовать ViewModel в Android? | PrepBro