我有一个Activity
,其中包含一些视图和两个片段(例如,TextInputFragment
和VoiceInputFragment
)。
我创建了下一个ViewModels:
ActivityViewModel
使用void onInput(String value)
方法interface InputViewModel
使用LiveData<String> getInput()
方法TextInputViewModel
和VoiceInputViewModel
作为InputViewModel
现在我想从两个片段中观察getInput并对它们做出反应。 我有下一个想法:
Activity.onCreate
:
ActivityViewModel avm = ViewModelProviders.of(this).get(ActivityViewModel.class);
TextInputViewModel tivm = ViewModelProviders.of(this).get(TextInputViewModel.class);
tivm.getInput().observeForever(avm::onInput);
VoiceInputViewModel vivm = ViewModelProviders.of(this).get(VoiceInputViewModel.class);
vivm.getInput().observeForever(avm::onInput);
这个想法是否正确?当配置更改和我的ViewModel尝试重新观察彼此时发生了什么?有没有解决方案?
答案 0 :(得分:0)
在研究和阅读ActivityViewModel.answer
来源后,我来到了下一个解决方案:
将MediatorLiveData<String>
字段的类型更改为public void addAnswerSource(LiveData<String> source) {
answer.removeSource(source); // to prevent throwing "This source was already added with the different observer" exception
answer.addSource(source, s -> answer.setValue(s));
}
并添加下一个方法:
Activity.onCreate
现在ActivityViewModel avm = ViewModelProviders.of(this).get(ActivityViewModel.class);
TextInputViewModel tivm = ViewModelProviders.of(this).get(TextInputViewModel.class);
avm.addAnswerSource(tivm.getInput());
VoiceInputViewModel vivm = ViewModelProviders.of(this).get(VoiceInputViewModel.class);
avm.addAnswerSource(vivm.getInput());
:
{{1}}