Compose + Retrofit:网络请求与状态处理

2024-06-09 · 24 min · 网络

Retrofit 是 Android 最流行的网络请求库,与 Kotlin 协程和 Compose 完美配合。本文将深入讲解如何优雅地处理网络请求和状态管理。

一、UiState 密封类

sealed interface UiState<out T> {
    data object Loading : UiState<Nothing>
    data class Success<T>(val data: T) : UiState<T>
    data class Error(val message: String) : UiState<Nothing>
}

二、安全 API 调用

suspend fun <T> safeApiCall(apiCall: suspend () -> T): Result<T> {
    return try {
        Result.Success(apiCall())
    } catch (e: Exception) {
        Result.Error(e)
    }
}

三、ViewModel 实现

@HiltViewModel
class ArticleListViewModel @Inject constructor(
    private val repository: ArticleRepository
) : ViewModel() {
    
    private val _uiState = MutableStateFlow<UiState<List<Article>>>(UiState.Loading)
    val uiState = _uiState.asStateFlow()
    
    fun loadArticles() {
        viewModelScope.launch {
            _uiState.value = UiState.Loading
            when (val result = repository.getArticles()) {
                is Result.Success -> _uiState.value = UiState.Success(result.data)
                is Result.Error -> _uiState.value = UiState.Error(result.exception.toUserMessage())
            }
        }
    }
}

四、在 Compose 中处理状态

@Composable
fun ArticleListContent(uiState: UiState<List<Article>>) {
    when (uiState) {
        is UiState.Loading -> LoadingContent()
        is UiState.Success -> ArticleList(uiState.data)
        is UiState.Error -> ErrorContent(uiState.message)
    }
}

五、最佳实践

总结