You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:48:20