5.13

8. 实现商品销售功能

在本部分中,您将扩展应用的功能以实现销售功能。此更新涉及以下任务:

  • 为 DAO 函数添加测试以更新实体。
  • 在 ItemDetailsViewModel 中添加一个函数以减少数量并更新应用数据库中的实体。
  • 如果数量为零,停用 Sell 按钮。
  1. 在 ItemDaoTest.kt 中,添加一个名为 daoUpdateItems_updatesItemsInDB() 且不带参数的函数。使用 @Test 和 @Throws(Exception::class) 对其进行注解。
 
@Test
@Throws(Exception::class)
fun daoUpdateItems_updatesItemsInDB()
  1. 定义函数并创建 runBlocking 代码块。在其中调用 addTwoItemsToDb()
 
fun daoUpdateItems_updatesItemsInDB() = runBlocking {
    addTwoItemsToDb()
}
  1. 调用 itemDao.update,使用不同的值更新两个实体。
 
itemDao.update(Item(1, "Apples", 15.0, 25))
itemDao.update(Item(2, "Bananas", 5.0, 50))
  1. 使用 itemDao.getAllItems() 检索实体。将其与更新后的实体进行比较并断言。
 
val allItems = itemDao.getAllItems().first()
assertEquals(allItems[0], Item(1, "Apples", 15.0, 25))
assertEquals(allItems[1], Item(2, "Bananas", 5.0, 50))
  1. 确保完成后的函数如下所示:
 
@Test
@Throws(Exception::class)
fun daoUpdateItems_updatesItemsInDB() = runBlocking {
    addTwoItemsToDb()
    itemDao.update(Item(1, "Apples", 15.0, 25))
    itemDao.update(Item(2, "Bananas", 5.0, 50))

    val allItems = itemDao.getAllItems().first()
    assertEquals(allItems[0], Item(1, "Apples", 15.0, 25))
    assertEquals(allItems[1], Item(2, "Bananas", 5.0, 50))
}
  1. 运行测试并确保测试通过。

在 ViewModel 中添加一个函数

  1. 在 ItemDetailsViewModel.kt 的 ItemDetailsViewModel 类中,添加一个名为 reduceQuantityByOne() 且不带参数的函数。
 
fun reduceQuantityByOne() {
}
  1. 在该函数内,使用 viewModelScope.launch{} 启动协程。

注意:您必须在协程内运行数据库操作。

 
import kotlinx.coroutines.launch
import androidx.lifecycle.viewModelScope

viewModelScope.launch {
}
  1. 在 launch 代码块内,创建一个名为 currentItem 的 val,并将其设置为 uiState.value.toItem()
 
val currentItem = uiState.value.toItem()

uiState.value 的类型为 ItemUiState。您可以使用扩展函数 toItem() 将其转换为 Item 实体类型。

  1. 添加 if 语句以检查 quality 是否大于 0
  2. 对 itemsRepository 调用 updateItem() 并传入更新后的 currentItem。使用 copy() 更新 quantity 值,使函数如下所示:
 
fun reduceQuantityByOne() {
    viewModelScope.launch {
        val currentItem = uiState.value.itemDetails.toItem()
        if (currentItem.quantity > 0) {
    itemsRepository.updateItem(currentItem.copy(quantity = currentItem.quantity - 1))
       }
    }
}
  1. 返回到 ItemDetailsScreen.kt
  2. 在 ItemDetailsScreen 可组合项中,转到 ItemDetailsBody() 函数调用。
  3. 在 onSellItem lambda 中,调用 viewModel.reduceQuantityByOne()
 
ItemDetailsBody(
    itemUiState = uiState.value,
    onSellItem = { viewModel.reduceQuantityByOne() },
    onDelete = { },
    modifier = modifier.padding(innerPadding)
)
  1. 运行应用。
  2. 在 Inventory 界面上,点击列表元素。当 Item Details 界面显示时,点按 Sell,您会注意到数量值减少了 1。

当用户点按“Sell”按钮后,“Item Details”界面中的数量会减少 1

posted @ 2024-06-19 22:21  混沌武士丞  阅读(3)  评论(0编辑  收藏  举报