Какие знаешь способы передачи данных из ViewModel во View в MVVM

«Какие знаешь способы передачи данных из ViewModel во View в MVVM» — вопрос из категории Архитектура, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

LiveData - поток данных с автоматической подпиской на изменения. Подходит для UI-обновлений:

val data = MutableLiveData<String>()
viewModel.data.observe(viewLifecycleOwner) { value ->
    textView.text = value
}

StateFlow - корутиновый аналог LiveData, требует явного запуска в lifecycleScope:

val state = MutableStateFlow("")
lifecycleScope.launch {
    viewModel.state.collect { value ->
        textView.text = value
    }
}

SharedFlow - для событий (snackbars, навигация), не хранит состояние:

private val _events = MutableSharedFlow<Event>()
val events = _events.asSharedFlow()

// В View
lifecycleScope.launch {
    viewModel.events.collect { event ->
        when(event) { ... }
    }
}

Классический колбэк через интерфейс (редко, для специфичных случаев).