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

Android无法创建Call Adapter求助:Retrofit获取Client列表失败

解决方案

你遇到的IllegalArgumentException是因为Retrofit不允许接口直接返回同步的List<Client>,它需要适配异步请求的包装类型,结合Coroutines挂起函数是最简洁的解决方式,以下是完整修正步骤:

1. 修正Retrofit API接口

将接口改为挂起函数(Retrofit 2.6.0+默认支持Coroutines挂起函数):

@GET("/clients")
suspend fun getAllClients(): List<Client>

2. 调整Repository实现

因为API接口已改为挂起函数,Repository的对应方法也要同步改为挂起函数:

override suspend fun getAllClients(): List<Client> {
    return clientTrackerApi.getAllClients()
}

3. ViewModel中管理数据状态

ViewModel需要用可观察的状态容器(如StateFlow)存储客户端列表,方便Compose界面实时监听:

class ClientListViewModel @Inject constructor(
    private val clientsRepository: ClientsRepository
) : ViewModel() {
    // 私有可变状态,仅内部修改
    private val _clients = MutableStateFlow<List<Client>>(emptyList())
    // 对外暴露不可变状态
    val clients: StateFlow<List<Client>> = _clients.asStateFlow()

    init {
        viewModelScope.launch {
            try {
                val fetchedClients = clientsRepository.getAllClients()
                _clients.value = fetchedClients
            } catch (e: Exception) {
                // 处理请求失败逻辑,比如打印日志或提示用户
                Log.e("ClientListVM", "获取客户端列表失败", e)
            }
        }
    }
}

4. Compose界面渲染LazyList

在界面中收集ViewModel的状态,用LazyColumn展示列表:

@Composable
fun ClientsListScreen() {
    val viewModel: ClientListViewModel = hiltViewModel()
    // 收集StateFlow状态,自动感知生命周期
    val clients by viewModel.clients.collectAsStateWithLifecycle()

    LazyColumn(
        modifier = Modifier.fillMaxSize(),
        contentPadding = PaddingValues(16.dp),
        verticalArrangement = Arrangement.spacedBy(8.dp)
    ) {
        items(clients) { client ->
            ClientItem(client)
        }
    }
}

// 单个客户端项的UI组件
@Composable
fun ClientItem(client: Client) {
    Card(
        modifier = Modifier.fillMaxWidth(),
        elevation = CardDefaults.cardElevation(4.dp)
    ) {
        Column(modifier = Modifier.padding(16.dp)) {
            Text(text = client.name, fontSize = 18.sp, fontWeight = FontWeight.Bold)
            Text(text = "年龄:${client.age}")
            client.aboutUser?.let {
                Text(text = it, modifier = Modifier.padding(top = 4.dp))
            }
            // 如需展示图片,可集成Coil等图片加载库处理client.picture路径
        }
    }
}

额外检查项

  • 确保Retrofit实例已配置JSON转换器(如GsonConverterFactory),且依赖版本兼容
  • 确认AndroidManifest.xml已声明网络权限:<uses-permission android:name="android.permission.INTERNET" />
  • 验证Client数据类字段与后端返回JSON的键名完全匹配(当前你的数据类配置是正确的)

内容的提问来源于stack exchange,提问作者Equlo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:05:52