
sealed class UiState {
object Loading : UiState()
data class Success(val data: List<String>) : UiState()
data class Error(val message: String) : UiState()
}
위에서 정의한 sealed class를 이용해 아래처럼 ViewModel에서 상태를 관리할 수 있다.
class MyViewModel : ViewModel() {
private val _uiState = MutableLiveData<UiState>()
val uiState: LiveData<UiState> get() = _uiState
fun fetchData() {
_uiState.value = UiState.Loading
viewModelScope.launch {
try {
val data = repository.getData() // 데이터 가져오는 코드
_uiState.value = UiState.Success(data)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message ?: "Unknown Error")
}
}
}
}
그러면 View에서 이렇게 상태에 따라 UI를 업데이트 할 수 있다.
viewModel.uiState.observe(viewLifecycleOwner) { state ->
when (state) {
is UiState.Loading -> showLoadingIndicator()
is UiState.Success -> showData(state.data)
is UiState.Error -> showError(state.message)
}
}