5.8
- 为删除 DAO 查询添加测试。
- 在
ItemDetailsViewModel
类中添加一个函数来删除数据库中的实体。 - 更新
ItemDetailsBody
可组合项。
添加 DAO 测试
- 在
ItemDaoTest.kt
中,添加一个名为daoDeleteItems_deletesAllItemsFromDB()
的测试。
@Test
@Throws(Exception::class)
fun daoDeleteItems_deletesAllItemsFromDB()
- 使用
runBlocking {}
启动协程。
fun daoDeleteItems_deletesAllItemsFromDB() = runBlocking {
}
- 向数据库添加两个商品,并对这两个商品调用
itemDao.delete()
,以将其从数据库中删除。
addTwoItemsToDb()
itemDao.delete(item1)
itemDao.delete(item2)
- 从数据库中检索实体,并检查列表是否为空。完成后的测试应如下所示:
import org.junit.Assert.assertTrue
@Test
@Throws(Exception::class)
fun daoDeleteItems_deletesAllItemsFromDB() = runBlocking {
addTwoItemsToDb()
itemDao.delete(item1)
itemDao.delete(item2)
val allItems = itemDao.getAllItems().first()
assertTrue(allItems.isEmpty())
}
在 ItemDetailsViewModel
中添加删除函数
- 在
ItemDetailsViewModel
中,添加一个名为deleteItem()
的新函数,该函数不带参数也不返回任何内容。 - 在
deleteItem()
函数内,添加一个itemsRepository.deleteItem()
函数调用并传入uiState.value.
toItem
()
。
suspend fun deleteItem() {
itemsRepository.deleteItem(uiState.value.itemDetails.toItem())
}
在此函数中,您将使用 toItem
()
扩展函数将 uiState
从 itemDetails
类型转换为 Item
实体类型。
- 在
ui/item/ItemDetailsScreen
可组合项中,添加一个名为coroutineScope
的val
,并将其设置为rememberCoroutineScope()
。此方法会返回一个协程作用域,该作用域会绑定到调用所在的组件(ItemDetailsScreen
可组合项)。
import androidx.compose.runtime.rememberCoroutineScope
val coroutineScope = rememberCoroutineScope()
- 滚动到
ItemDetailsBody()
函数。 - 在
onDelete
lambda 内使用coroutineScope
启动协程。 - 在
launch
代码块内,对viewModel
调用deleteItem()
方法。
import kotlinx.coroutines.launch
ItemDetailsBody(
itemUiState = uiState.value,
onSellItem = { viewModel.reduceQuantityByOne() },
onDelete = {
coroutineScope.launch {
viewModel.deleteItem()
}
modifier = modifier.padding(innerPadding)
)
- 删除商品后,返回到“Inventory”界面。
- 在
deleteItem()
函数调用后调用navigateBack()
。
onDelete = {
coroutineScope.launch {
viewModel.deleteItem()
navigateBack()
}