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

Подробнее тут.

Для реализации связи между View и ViewModel используется патерн observer, то есть View подписывается на ViewModel, а ViewModel ничего не знает о view.

Пример использования:

1. ViewModel

class CardInfoViewModel(
        profileInteractor: ProfileInteractor,
        schedulers: Schedulers
) : ViewModel() {

    val profileState = MutableLiveData<Profile>()

    init {
        profileInteractor.observeProfile()
                .subscribeOn(schedulers.io())
                .observeOn(schedulers.ui())
                .observe({ profileState.value = it })
    }
}

2. ViewModelFactory

Чтобы передать параметры во 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
    }
}

3. Привязка ViewModel к Fragment

Объект 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.