在没有其他要求之前,我并没有要求解决此问题(代码),而是要求我对LiveData的理解进行更正,因为我认为自己缺少一些内容。
据我所知,LiveData的onActive函数每当观察者(LifeCycleOwner)在Activity或Fragment的onCreate方法中处于活动状态时就会触发一次。
这是我现在要处理的问题。
我使用 Android导航组件,我的Activity A拥有一个导航图,在此图中,两个片段共享通用逻辑,因此,与其创建用于相互通信的接口,为了简便起见,我使用ViewModel来命名为ActivityAViewModel。
现在,此VM包含以下内容。
ActivityAViewModel.kt
// Private Mediator LiveData
private val mediatorLD = MediatorLiveData<Boolean>()
// Public immutable access of the mediator LiveData
fun mediatorLD(): LiveData = mediatorLD
// Representation of what the transformation is doing.
fun doFoo() {
val workLD: LiveData<WrapperClass<Boolean>> = repository.someWork()
Transformations.map(workLD) { wrappedResult ->
mediatorLD.postValue(wrappedResult.myBoolean)
}
}
现在,两个UI控制器MyFragmentB.kt和MyFragmentC.kt正在观察MutableLiveData的LiveData版本,我的问题是,当MyFragmentB执行doFoo()时,它会相应地接收结果,那里没有问题,但是当我导航到MyFragmentC.kt时,相同的结果会报告给C,反之亦然。
我不希望发生这种情况,如果FragmentB已经观察到了更改,那么我就不会C来监听该更改。
我有点理解为什么会这样。
据我所知,LiveData的onActive函数每当观察者(LifeCycleOwner)在Activity或Fragment的onCreate方法中处于活动状态时就会触发一次。
由于已使用 postValue 检测到更改,因此ViewModel正在等待其观察者处于活动状态以便分派结果。
导航到另一个片段时,观察者准备就绪,触发onActive并检测到更改。
是否有办法防止两个片段接收结果?我的意思是,当这两个中的一个收到结果时,另一个不会听吗?
答案 0 :(得分:1)
您应该相应地设计此事件,与Jeel分享的博客文章中讨论的Event Wrapper非常相似。
基本思想是Event将仅使用一次。然后,您可以使用LiveData将其包装。在LiveData中设置新事件时,将在第一次使用新事件之后通知观察者该事件,后续使用将不返回任何值。