Efficient way to load initial data in viewModel android

Create a data class for manage your UiState

data class PostListUiState(
    val isLoading: Boolean = false,
    val list: List<Post> = emptyList(),
)Code language: HTML, XML (xml)

Follow below code in your ViewModel with your respected functions

import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class PostListViewModel @Inject constructor(
    private val repository: ProblemPostRepository
): ViewModel() {
    private val _errorChannel = Channel<String>()
    val errorChannel = _errorChannel.receiveAsFlow()
    private val _uiState = MutableStateFlow(PostListUiState())
    val uiState = _uiState.onStart {
        loadPostList()
    }
        .stateIn(
            viewModelScope,
            SharingStarted.WhileSubscribed(),
            PostListUiState()
        )
    
    private fun loadPostList() {
        viewModelScope.launch {
            repository.loadProblemPosts()
                .onEach {dataState ->
                    _uiState.update {
                        it.copy(
                            isLoading = dataState.loading
                        )
                    }
                    dataState.data?.let { list ->
                        _uiState.update {
                            it.copy(
                                list = list
                            )
                        }
                    }
                    dataState.error?.let { message ->
                        _errorChannel.send(message)
                    }
                }.launchIn(viewModelScope)
        }
    }

}Code language: HTML, XML (xml)

Thanks & regards to Philipp Lackner, here is video link
https://www.youtube.com/watch?v=mNKQ9dc1knI




Leave a Reply

Your email address will not be published. Required fields are marked *