Android 当片段进入后台时,导航 + LiveData 停止观察

Android Navigation + LiveData stopped observing when fragment goes to background

我有 2 个片段,我通过 Jetpack 的导航组件进行导航。当我从片段 2 返回到片段 1 时,我通过片段 2 的实时数据触发了一个事件,片段 1 应该正在观察。虽然,片段 1 没有观察到,当我设置一个断点来检查 liveData 有多少观察者时,它说 0。 下面的代码

class Fragment1 :
Fragment() {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
   
      myViewModel.selectedItem.observe(viewLifecycleOwner, {
            println("Observed")
        })
 findNavController().navigate(
                    Fragment1Directions.actionToFragment2()
                )
}


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    myViewModel = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
}

private lateinit var myViewModel: MyViewModel

}

class 片段 2: 片段(){

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)


    myButton.setOnClickListener{
        MyViewModel().selectItem(true)
        findNavController().navigateUp()
    }
}

}

class MyViewModel : ViewModel() {

private val mutableSelectedItem = MutableLiveData<Boolean>()
val selectedItem: LiveData<Boolean> get() = mutableSelectedItem

fun selectItem(value: Boolean) {
    mutableSelectedItem.value = value
}

}

没有观察员很奇怪
myViewModel.selectedItem.observe(viewLifecycleOwner, {
            println("Observed")
        })

当它被称为 onViewCreatedviewLifecycleOwner 时,但看起来您在为 Fragment1Fragment2 创建公共 ViewModel 时犯了一个错误

两者都应该使用

myViewModel = ViewModelProvider(requireActivity()).get(MyViewModel::class.java) 得到相同的 ViewModel 两个片段