Android Fragments 具有公共观察者的共享视图模型Android

b0zn9rqh  于 2023-10-19  发布在  Android
关注(0)|答案(1)|浏览(142)

在我的用例中,我使用了一个共享视图模型和一些公共观察者。当三个片段被添加到后栈时,视图模型观察到所有三个片段。不过,我只需要观察当前可见的碎片。
只需要观察当前可见片段中的事件,而不是观察所有其他片段

oymdgrw7

oymdgrw71#

共享视图模型用于在多个观察者之间共享公共数据源。当您有一个源的多个观察者时,您不应该尝试只观察当前可见片段中的变化。如果这样做,可能会发生数据不一致。
假设你在一个片段中修改了ViewModel中的数据,如果其他片段停止观察它,它们可能有旧的数据值,但数据被改变了,因此数据不一致。
你要做的是观察一个事件,而不是陈述。你想消除片段,那是一个事件。要将LiveData用于事件,必须在事件完成时重置该值。因此,如果其他观察者观察它,他们不会发现事件正在发生。你可以在这里阅读更多关于它。下面是一个例子:
1.为事件状态创建LiveData

// this is your live data based on which event will occur
val timer = MutableLiveData<Boolean>()

// this is the live data for handling the event
val eventDismissFragment = MutableLiveData<Boolean>()

init{
   // initialize event to false
   eventDismissFragment.value = false
}

// this is the function that is called when the event occurred
fun onFinish() {
    timer.value = 0
    eventDismissFragment.value = true
}

// this is for resetting the value of LiveData after event is handled
fun onDismissFragmentComplete() {
    eventDismissFragment.value = false
 }

1.观察事件而不是计时器来消除片段

viewModel.eventDismissFragment.observe(viewLifecycleOwner, Observer { isFinished ->
         if (isFinished){
         // dismiss your fragment here but before dismissing
         // notify the ViewModel that you handled the event
         viewModel.onDismissFragmentComplete()

         dismissFragment()
         }
     })

相关问题