详情页删除条目后返回列表页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
相关产品推荐
相关产品推荐

