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

如何在Kotlin中访问数组响应中的对象属性?

解决方法

1. 处理列表元素的可空性

你的shipping列表类型是List<ShippingByTrackingIdQuery.Data1?>?,说明列表里的每个ship对象可能为null,必须先处理可空性避免空指针异常:

if (shipping?.isNotEmpty() == true) {
    for (ship in shipping) {
        ship?.let { nonNullShip ->
            // 安全访问属性
            Log.d("HELLO", "ID: ${nonNullShip._id}, 追踪号: ${nonNullShip.trackingId}")
        }
    }
}

2. 确认属性的可访问性

从你打印的toString结果来看,Data1类确实包含_id、trackingId等属性。如果还是无法直接访问,检查Apollo生成的Data1类:

  • Apollo默认生成的类属性都是public,直接用nonNullShip._id即可
  • 若属性为私有,会自动生成对应的getter方法(比如nonNullShip.id()),但根据你的输出,直接用_id是正确的

3. 优化ViewModel的可空性(可选)

如果业务上能保证返回的列表中没有null元素,可以修改getShipping的返回类型,减少上层的可空处理:

private suspend fun getShipping(trackingId: String): List<ShippingByTrackingIdQuery.Data1> {
    val response = apolloClient().query(ShippingByTrackingIdQuery(trackingId = trackingId)).execute()
    if (response.hasErrors()) {
        Log.w("ShippingByTrackingId", "请求失败: ${response.errors?.get(0)?.message}")
    }
    val result = response.data?.shippingByTrackingId?.data ?: emptyList()
    return result.filterNotNull() // 过滤掉所有null元素
}

上层代码可以简化为:

shipping?.forEach { ship ->
    Log.d("HELLO", "ID: ${ship._id}")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:29:58