Получают ViewModel через viewModel() / Hilt hiltViewModel(), собирают StateFlow/Flow как State (collectAsStateWithLifecycle) и передают immutable UI-state в composable.
Разбор
UI шлёт события (intent), VM обновляет state — однонаправленный поток.
Не храните Context/View в ViewModel.
SavedStateHandle для аргументов навигации и process death.
Preview используют fake state без реальной VM.
Пример
@ComposablefunProfileScreen(vm: ProfileVm = hiltViewModel()) {
val state by vm.state.collectAsStateWithLifecycle()
ProfileContent(state, onEvent = vm::onEvent)
}
Итог
ViewModel владеет бизнес-state; Compose — отображение и события.