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

Android Jetpack Navigation+LiveData 回退时Fragment未观察到事件问题

问题根因
  • 你在Fragment2中触发事件时直接通过构造方法MyViewModel()创建了全新的ViewModel实例,和Fragment1中通过ViewModelProvider(requireActivity())获取的、绑定宿主Activity的共享ViewModel完全是两个独立对象,你修改的是新实例的LiveData,自然Fragment1观察的旧实例收不到任何回调,你断点看到的观察者为0的LiveData就属于这个新建的独立ViewModel。
修复方案

首先在Fragment2中也获取和Fragment1同源的Activity级别共享ViewModel,不要自行创建ViewModel实例,修改后的代码如下:

class Fragment2 : Fragment() {
    // 声明共享ViewModel变量
    private lateinit var myViewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 和Fragment1保持一致,从宿主Activity获取共享ViewModel实例
        myViewModel = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        myButton.setOnClickListener{
            // 用共享实例发送事件,不要新建MyViewModel
            myViewModel.selectItem(true)
            findNavController().navigateUp()
        }
    }
}

修复后回到Fragment1就能正常收到LiveData回调。如果该事件属于一次性消费场景(比如提示、跳转触发),建议给LiveData添加消费标记,避免页面重建时重复收到历史事件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:45:02