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

详情页删除条目后返回列表页App崩溃问题分析与解决

问题:删除条目后App崩溃,但删除操作实际执行成功

代码场景

DetailViewModel中的删除函数

fun delete(id: Int) {
  viewModelScope.launch {
    repository.delete(
       Item(
          id = id,
          name = state.name,
       )
    )
 }
}

DetailScreen的删除按钮逻辑

FilledTonalButton(
  onClick = {
     viewModel.delete(id)
     navigateBack() //返回列表页
  },               
)

对比:ListViewModel中正常工作的删除逻辑

ListViewModel的delete函数:

fun delete(item: Item) {
      viewModelScope.launch {
        repository.delete(
           item
        )
     }
}

ListScreen中触发删除的代码:

ElevatedCard (
  elevation = CardDefaults.cardElevation(
    defaultElevation = dimensionResource(id = R.dimen.dimen_8dp)
  ),
  modifier = Modifier           
      .clickable {
         listViewModel.delete(item)
      }
)

报错信息

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.utils.deutsch.data.room.Item.getName()' on a null object reference

注:该报错来自Room自动生成的protected void bind方法。

问题根源与解决方法

问题出在DetailViewModel的init函数中:原本存在一个Flow,会在数据库发生修改时尝试获取对应ID的Item,但删除操作执行后,数据库中已无该条目,Flow收集到的it为null,后续调用it.name时触发空指针异常。

修改后的init函数添加了非空检查,避免空指针:

init {
        if(id!= -1){
            viewModelScope.launch {
                repository.getItem(id).collectLatest {
                    if(it != null){ //添加非空检查
                        state = state.copy(
                            nameIt = it.name
                        )
                    }
                }
            }
        }
    }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:43:10