Как сообщить View что что-то произошло в MVVM

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

Ответ

В MVVM для уведомления View о событиях из ViewModel используются LiveData или StateFlow/SharedFlow. View подписывается на изменения и реагирует на них.

LiveData пример:

// ViewModel
private val _event = MutableLiveData<Event>()
val event: LiveData<Event> = _event

fun triggerEvent() {
    _event.value = Event()
}

// Activity/Fragment
viewModel.event.observe(this) { event ->
    // handle event
}

StateFlow пример:

// ViewModel
private val _event = MutableSharedFlow<Event>()
val event = _event.asSharedFlow()

suspend fun triggerEvent() {
    _event.emit(Event())
}

// Activity/Fragment
lifecycleScope.launch {
    viewModel.event.collect { event ->
        // handle event
    }
}

Ключевые моменты:

  • ViewModel никогда не держит ссылки на View
  • View подписывается на изменения через Observer/Collect
  • Для одноразовых событий можно использовать SingleLiveEvent или специальные шаблоны с SharedFlow