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

Jetpack Compose调用API添加超级英雄列表时空指针崩溃排查

修复Jetpack Compose超级英雄卡牌游戏的API调用空指针异常&批量列表生成问题

问题核心

批量调用超级英雄API添加卡牌时,lista!!.add(superHero)触发NullPointerException崩溃,仅单个英雄获取正常——本质是可空列表未初始化就执行强制非空断言,批量协程调用时列表实例还未创建,直接解包导致空指针。

解决方案步骤

1. 替换可空列表为非空状态列表

在ViewModel中,用mutableStateListOf初始化非空的状态列表,既避免可空性问题,又能自动通知Compose更新UI:

class SuperHeroViewModel(private val apiService: SuperHeroApi) : ViewModel() {
    // 内部可变状态列表,用于修改数据
    private val _playerCards = mutableStateListOf<SuperHero>()
    // 对外暴露不可变列表,供UI观察
    val playerCards: List<SuperHero> = _playerCards

    // ...其他代码
}

2. 重构批量API调用逻辑

移除非空断言!!,直接操作已初始化的状态列表。如果需要并行调用API提升效率,可用async/await批量获取后统一添加;如果需要顺序调用,直接循环处理即可:

并行调用示例(效率更高)

fun fetchPlayerCards(heroIds: List<String>) = viewModelScope.launch {
    try {
        // 批量发起异步API请求
        val deferredHeroes = heroIds.map { id ->
            async { apiService.getSuperHero(id) }
        }
        // 等待所有请求完成,过滤可能为空的响应
        val fetchedHeroes = deferredHeroes.awaitAll().filterNotNull()
        // 一次性添加到列表,减少UI重绘次数
        _playerCards.addAll(fetchedHeroes)
    } catch (e: Exception) {
        // 处理API调用异常,比如日志上报或Toast提示
        Log.e("SuperHeroViewModel", "Failed to fetch heroes", e)
    }
}

顺序调用示例

fun fetchPlayerCards(heroIds: List<String>) = viewModelScope.launch {
    heroIds.forEach { id ->
        try {
            val hero = apiService.getSuperHero(id)
            hero?.let { _playerCards.add(it) }
        } catch (e: Exception) {
            Log.e("SuperHeroViewModel", "Failed to fetch hero $id", e)
        }
    }
}

3. UI层适配状态列表

在Composable组件中直接观察playerCards状态,自动渲染更新:

@Composable
fun PlayerCardList(viewModel: SuperHeroViewModel = viewModel()) {
    LazyColumn {
        items(viewModel.playerCards) { hero ->
            SuperHeroCard(hero = hero)
        }
    }
}

关键说明

  • 原崩溃原因:lista被声明为可空类型(如var lista: MutableList<SuperHero>? = null),批量协程调用时,lista还未被赋值为MutableList实例就执行lista!!.add(),触发空指针;单个调用时可能刚好在执行add前完成了列表初始化,因此未暴露问题。
  • 使用mutableStateListOf而非普通MutableList:确保列表修改时自动通知Compose重组UI,符合Jetpack Compose的状态管理规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:10:29