使用Job.join()未等数据库更新,Jetpack Compose弹窗提前显示问题排查
问题描述
当购物清单的最后一项被添加到购物车时,我的Jetpack Compose UI会检查是否所有物品都已加入购物车并显示弹窗。我希望每次添加物品后,等待数据库更新完成再执行检查,但即使使用Job.join()或async/await,弹窗仍会在数据库更新完成前立即显示。
Dao
@Update(entity = ShoppingListItemEntity::class) suspend fun updateShoppingListItem(item: ShoppingListItemEntity): Int
Repository
override suspend fun updateShoppingListItem(shoppingListItem: ShoppingListItem): Int { return shoppingListItemDao.updateShoppingListItem( shoppingListItemMapper.mapToEntity(shoppingListItem) ) }
Use Case
class UpdateShoppingListItemUseCase@Inject constructor( private val shoppingListItemsRepository: ShoppingListItemsRepository ) { suspend operator fun invoke(shoppingListItem: ShoppingListItem): Int { return shoppingListItemsRepository.updateShoppingListItem(shoppingListItem) } }
ViewModel(使用Job.join()写法)
private fun updateShoppingListItemInDb(item: ShoppingListItem) { viewModelScope.launch { val job = launch { updateShoppingListItemUseCase(item) } job.join() // 这行代码会立即执行 setStateValue(IS_CHECK_IF_LAST_ITEM_IN_SHOPPING_CART, true) } }
ViewModel(使用async/await写法)
private fun updateShoppingListItemInDb(item: ShoppingListItem) { viewModelScope.launch { val asyncTask = async { updateShoppingListItemUseCase(item) } val rowsAffected = asyncTask.await() if(rowsAffected == 1) { // 这行代码会立即执行 setStateValue(IS_CHECK_IF_LAST_ITEM_IN_SHOPPING_CART, true) } } }
内容的提问来源于stack exchange,提问作者Raj Narayanan
相关产品推荐
相关产品推荐

