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
相关产品推荐
相关产品推荐

