API调用成功但Compose始终判定列表为空问题排查修复
问题根因
- 日志中两条
baseline.prof相关报错是Android系统的已知无关警告,和当前列表加载失败问题无任何关联,无需额外处理。 - 核心错误是协程使用逻辑错误:
getEarthquakeList()函数内部额外启动了一个新的viewModelScope.launch协程块,这个协程是异步执行的:函数初始化list为空列表后会立刻返回空值,根本不会等待内部协程的接口请求完成。等内部协程拿到接口数据、给局部变量list赋值时,外层init块早已经拿到返回的空列表赋值给_state了,后续对局部变量list的修改不会触发StateFlow的更新,所以UI始终拿到空列表,一直显示加载进度条。 - 你能在日志里打印出接口返回数据,只是证明内部协程确实执行成功拿到了数据,但这个数据没有被正确赋值到可观察的StateFlow中,自然无法触发UI刷新。
最简修复方案
删除getEarthquakeList()内部多余的协程启动逻辑,将函数改为挂起函数,直接在协程作用域内顺序执行接口请求、返回结果即可,修复后的ViewModel代码如下:
private val _state = MutableStateFlow(emptyList<Earthquake>()) val state: StateFlow<List<Earthquake>> = _state init { viewModelScope.launch { _state.value = getEarthquakeList() } } private suspend fun getEarthquakeList() : List<Earthquake> { val apiService = ApiService.getInstance() return try { val response = apiService.getEarthquakes() Log.d("Response", response.data[0].title) response.data } catch (e: Exception) { e.printStackTrace() emptyList() } }
注意:MainActivity中的Composable代码无需任何修改,修复ViewModel后即可正常渲染列表。
内容的提问来源于stack exchange,提问作者Grim Reaper
相关产品推荐
相关产品推荐

