ViewModel — класс, разработанный для хранения и управления данными, связанными с пользовательскими интерфейсом, с учетом жизненного цикла.
Подробнее тут.
Для реализации связи между View и ViewModel используется патерн observer, то есть View подписывается на ViewModel, а ViewModel ничего не знает о view.
Пример использования:
class CardInfoViewModel(
profileInteractor: ProfileInteractor,
schedulers: Schedulers
) : ViewModel() {
val profileState = MutableLiveData<Profile>()
init {
profileInteractor.observeProfile()
.subscribeOn(schedulers.io())
.observeOn(schedulers.ui())
.observe({ profileState.value = it })
}
}
Чтобы передать параметры во ViewModel через конструктор необходимо создать кастомную фабрику.
internal class OnboardingViewModelFactory(
private val onboardingRepository: OnboardingRepository,
private val navigationListener: NavigationListener,
private val exceptionsMapper: ExceptionsInfoMapper
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return OnboardingViewModel(
onboardingRepository,
navigationListener,
exceptionsMapper
) as T
}
}
Объект OnboardingViewModelFactory создается в локальном скоупе дагере.
internal class OnboardingFragment : Fragment() {
@Inject
lateinit var viewModelFactory: BaseViewModelFactory
private val viewModel: OnboardingViewModel by lazy {
ViewModelProviders.of(this, viewModelFactory)[OnboardingViewModel::class.java]
}
Важно: ViewModel ничего не должна знать о View, к которой она привязана. View подписывается на поля из ViewModel через паттерн Observer (Coroutine Flow, Rx или LiveData). Логика представления должна обрабатываться во ViewModel.