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

Fragment无法接收共享ViewModel的LiveData更新问题求助

问题根因
  • Koin提供的by viewModel()注入方式默认以当前组件为ViewModel所有者:在Activity中调用时,生成的ViewModel实例绑定Activity生命周期;在Fragment中调用时,生成的ViewModel实例绑定当前Fragment自身的生命周期。当前写法会让Activity和Fragment拿到两个完全独立的RFIDTagViewModel实例,两者的数据互不连通。
  • Activity更新的是自身持有ViewModel的LiveData,Fragment观察的是另一个独立实例的LiveData,自然收不到更新回调。
修复方案

修改Fragment中的ViewModel注入代码,将by viewModel()替换为Koin提供的by activityViewModel(),该方法会从Fragment的宿主Activity的ViewModelStore中获取已存在的ViewModel实例,保证Activity和Fragment共享同一个ViewModel对象:

class PickingItemFragment : Fragment() {
    // 仅需修改此行注入代码
    private val rfidViewModel: RFIDTagViewModel by activityViewModel()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        rfidViewModel.rfidTagUUID.observe(viewLifecycleOwner, { tagUUID ->
            Timber.d("现在可以正常收到回调")
        })
        // 原有返回布局逻辑保持不变即可
        return inflater.inflate(R.layout.fragment_picking_item, container, false)
    }
}

原有Koin配置、Activity代码、ViewModel代码均无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:21:01