Android电商App购物车添加商品后MutableLiveData未更新,来回导航才显示正常值
问题原因
- 总价未更新的核心原因:
CartFragment中仅在onViewCreated生命周期执行时一次性读取了totalPrice的值,没有对totalPrice这个LiveData设置观察回调。getTotalPrice是异步协程操作,onViewCreated执行时数据库查询还未返回,拿到的就是初始值null,渲染出来就是默认0值。当你切走页面再返回,onViewCreated会重新执行,此时之前的异步查询已经返回结果,就能拿到正确数值。 - 商品数量显示null的原因:首先你在
CartAdapter的bind方法中直接调用cart.quantity.toString(),如果插入商品到Room的时候没有给quantity字段设置非空默认值,首次插入时该字段就是null,转字符串就会显示null。其次你在bind方法里调用的daoViewModel.getQuantity(cart.id)完全没有作用:你把查询到的数量存在了共享的_itemQuantity这个LiveData里,既没有给对应item设置观察回调更新UI,多个item同时调用还会互相覆盖结果,完全没必要写这个逻辑。 - 隐藏问题:你添加/修改/删除购物车商品后,Room会自动推送新的购物车列表到
daoViewModel.cart这个LiveData,但是你没有在购物车列表更新时重新计算总价,也不会触发UI更新,自然总价不会跟着变。
修复方案
1. 修复总价更新逻辑
在CartFragment的onViewCreated里给totalPrice添加观察回调,每次值变化的时候更新UI,同时在购物车列表变化的时候触发重新计算总价,删除原有的一次性读取值的逻辑:
// CartFragment onViewCreated 内修改 daoViewModel.totalPrice.observe(viewLifecycleOwner) { total -> val formattedPrice = NumberFormat.getCurrencyInstance().format(total ?: 0.0) binding.totalPrice.text = "Total Price: ${formattedPrice}" } daoViewModel.cart.observe(viewLifecycleOwner) { adapter.submitList(it) daoViewModel.getTotalPrice() // 每次购物车列表变更就重新计算总价 } // 删掉原来onViewCreated末尾直接读取totalPrice.value设置UI的代码
2. 修复商品数量显示问题
首先确保你插入商品到购物车的时候,给Cart对象的quantity字段赋值至少1,不要留空。其次删掉Adapter的bind方法里无用的daoViewModel.getQuantity(cart.id)和daoViewModel.calculatePrice(cart.id)两行代码,你需要的数量和价格字段都已经在Cart对象里了,直接用即可,同时加空安全处理避免null:
// CartAdapter bind方法修改 fun bind(cart: Cart) { binding.apply { Glide.with(itemView) .load(cart.image) .centerCrop() .transition(DrawableTransitionOptions.withCrossFade()) .into(itemImage) // 删除上面两行无用的viewModel调用 itemTitle.text = cart.title val price: Double = cart.price val formattedPrice: String = NumberFormat.getCurrencyInstance().format(price) itemPrice.text = "Price: ${formattedPrice}" // 增加空安全处理 itemQuantity.text = (cart.quantity ?: 1).toString() removeItem.setOnClickListener { listener.onItemClick(cart) } addButton.setOnClickListener { listener.onQuantityAdd(cart.id) } decreaseButton.setOnClickListener { listener.onQuantitySubtract(cart.id) } } }
可选优化
可以删掉DaoViewModel里没用的_itemQuantity、_itemPrice两个LiveData和对应的getQuantity、calculatePrice方法,完全没有用到还会占用资源。
内容的提问来源于stack exchange,提问作者Ahmadddd4
相关产品推荐
相关产品推荐

