因此,在工作中,我们在具有数据绑定的MVVM体系结构中有4个片段的活动。
InfoActivity
ScreenOneFragment
ScreenTwoFragment
ScreenTreeFragment
ScreenFourFragment
每个片段都是自己的视图模型,可以通过ViewModelProvider进行访问
ScreenOneVM
ScreenTwoVM
ScreenTreeVM
ScreenFourVM
ViewModelProvider
是某种单例管理器,一旦有人请求一台虚拟机,便会构建此虚拟机,然后总是将这个实例提供给所有人。 (直到infoActivity死亡)
第一个问题:
当屏幕3发生特定变化时,我想更新屏幕4的一部分
在ScreenFourFragment
方法的OnActivityCreated
中,从ScreenTreeVm
请求ViewModelProvider
。
检索到screenTreeVm
后,片段将观察该VM的属性
screenTreeVm.getLastSelectedUserChoice().observe(this, this::updateLeftDrawer);
这个获取器就是这样,以确保每个人都使用相同的实例:
public MutableLiveData<UserChoice> getLastSelectedUserChoice() {
if (null == this.lastUserChoice) {
this.lastUserChoice = new MutableLiveData<>();
}
return this.lastUserChoice;
}
这样,每当用户在第三屏幕中更改微调器的值时,第四屏幕视图模型就会更新。
第二个问题:
MutableLiveData<Boolean> isUpdateRequired
中有一个ScreenFourVM
,有时其他分片会在其中设置一个值,以触发screenFour
中的更新方法。
再次在OnActivityCreated
的{{1}}方法中,将观察者置于该属性上(该属性位于ScreenFourFagment
中)
(设置值时,观察者总是触发,即使该值与以前相同)
我不是很喜欢,因为这并不是“是否需要更新”
如果ScreenFourVm
将其设置为true,则它将触发该方法
如果在ScreenOneFragment
之后将其设置为true(虽然已经为true),则会触发该方法
但是isUpdateRequired的内容始终为true。
在我看来这是些意大利面混乱,有时某个片段将在screenFourvm中设置一个值来触发更改,有时screenFourVm将触发一个更改,因为它正在观察其他VM中的属性。
您将如何解决这个问题?
谢谢。