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")
})
当它被称为 onViewCreated
和 viewLifecycleOwner
时,但看起来您在为 Fragment1
和 Fragment2
创建公共 ViewModel
时犯了一个错误
两者都应该使用
myViewModel = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
得到相同的 ViewModel
两个片段
我有 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")
})
当它被称为 onViewCreated
和 viewLifecycleOwner
时,但看起来您在为 Fragment1
和 Fragment2
创建公共 ViewModel
时犯了一个错误
两者都应该使用
myViewModel = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
得到相同的 ViewModel
两个片段