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

Android购物车添加商品后CartFragment无内容显示问题求助

购物车数据跨Fragment不共享问题排查与解决

问题描述

在MenuFragment中点击商品添加至购物车时,日志显示商品已成功加入且购物车列表完成更新,但切换到CartFragment后页面无任何内容展示。日志显示CartFragment的观察者监听到的是空列表,并将空列表传递给了适配器。

核心原因

问题根源在于ViewModel的作用域错误:MenuFragment和CartFragment各自通过by viewModels()获取的CartViewModel是两个完全独立的实例。by viewModels()默认创建的是Fragment级别的ViewModel,每个Fragment实例会拥有专属的ViewModel对象,因此MenuFragment中添加的购物车数据无法同步到CartFragment的ViewModel中。

解决方案

要实现跨Fragment的购物车数据共享,需要将CartViewModel的作用域提升至Activity级别,这样同一个Activity下的所有Fragment都会获取到同一个ViewModel实例,数据自然同步。

具体修改步骤

  1. 修改MenuFragment中CartViewModel的获取方式
    将原有的Fragment级别ViewModel获取代码替换为Activity级别:

    // 先导入activityViewModels
    import androidx.fragment.app.activityViewModels
    
    @AndroidEntryPoint
    class MenuFragment : Fragment() {
        // ...其他代码
        // 替换viewModels()为activityViewModels()
        private val cartViewModel: CartViewModel by activityViewModels()
        // ...其他代码
    }
    
  2. 修改CartFragment中CartViewModel的获取方式
    同样替换为Activity级别获取:

    // 先导入activityViewModels
    import androidx.fragment.app.activityViewModels
    
    @AndroidEntryPoint
    class CartFragment : Fragment() {
        // ...其他代码
        // 替换viewModels()为activityViewModels()
        private val cartViewModel: CartViewModel by activityViewModels()
        // ...其他代码
    }
    

额外调试优化

原CartAdapter的setCartItems方法日志打印的是旧数据,建议修改为打印新数据,方便调试验证:

fun setCartItems(newCartItems: List<DishModel>) {
    Log.d("CartAdapter", "Setting cart items: $newCartItems")
    cartItems = newCartItems
    notifyDataSetChanged()
}

内容的提问来源于stack exchange,提问作者MexicoKiD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:07:03