ViewModel从另一个ViewModel观察LiveData

时间:2018-04-13 13:57:56

标签: java android android-architecture-components android-livedata android-viewmodel

我有一个Activity,其中包含一些视图和两个片段(例如,TextInputFragmentVoiceInputFragment)。

我创建了下一个ViewModels:

  • ActivityViewModel使用void onInput(String value)方法
  • interface InputViewModel使用LiveData<String> getInput()方法
  • TextInputViewModelVoiceInputViewModel作为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尝试重新观察彼此时发生了什么?有没有解决方案?

1 个答案:

答案 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}}