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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:31:32