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