# The right way to collect/observe from LiveData/Flow in ViewModel ### Flow ```kotlin= // Declare the flow private val canGoBack = MutableStateFlow(true) // Expose function to collect fun collectCanGoBackFlow( viewLifecycleOwner: LifecycleOwner, flowCollector: FlowCollector<Boolean>, ) { viewLifecycleOwner.lifecycleScope.launch { canGoBack.flowWithLifecycle(viewLifecycleOwner.lifecycle) .collect(flowCollector) } } // Emit it viewModelScope.launch { canGoBack.emit(false) } // Collect from UI viewModel.collectCanGoBackFlow(viewLifecycleOwner) { isVisible = it } // Or extension fun <T : Any?> LifecycleOwner.collectFlowWithLifeCycle( flow: Flow<T>, flowCollector: FlowCollector<T>, ) { lifecycleScope.launch { flow.flowWithLifecycle(lifecycle).collect(flowCollector) } } // Then collect on VM using the extension fun collectCanGoBackFlow( viewLifecycleOwner: LifecycleOwner, collectorBlock: FlowCollector<Boolean>, ) { viewLifecycleOwner.collectFlowWithLifeCycle(canGoBack, collectorBlock) } ``` ### LiveData ```kotlin= // Declare the livedata private val registerAccountUiStateLiveData = MutableLiveData<RegisterAccountUiState>() // Expose function to observe fun observeRegisterAccountLiveData( lifecycleOwner: LifecycleOwner, observingBlock: (RegisterAccountUiState) -> Unit, ) { registerAccountUiStateLiveData.observe(lifecycleOwner, observingBlock) } // Post it viewModelScope.launch { registerAccountUiStateLiveData.postValue(...) } // Observe from UI viewModel.observeRegisterAccountLiveData(viewLifecycleOwner) { ... } ```