【问题标题】:Android MVVM 2 ViewModels Sharing 1 Repository with LiveDataAndroid MVVM 2 ViewModels 与 LiveData 共享 1 个存储库
【发布时间】:2020-09-17 11:52:38
【问题描述】:

我对使用 Repository 的 MVVM 模式有疑问。

  • 我有一个包含 2 个片段的活动。我们称他们为FragmentAFragmentB

  • 这 2 个片段有自己的 viewModel,例如 viewModelAviewModelB

  • 我还有一个只提供本地数据的存储库类。没有网络请求。只是一个 MutableList。

  • FragmentAFragmentB 通过 LiveData 观察各自的 viewModel。

//FragmentA Observes viewModelA
viewModelA.cartContent.observe(viewLifecycleOwner, Observer { content ->

})
// ViewModelA exposes cartContent
val cartContent: LiveData<MutableList<Item>> = repository.getContent()
// Repository
private val contentRepository = mutableListOf<Item>()
fun getContent() : LiveData<MutableList<Item>> {
  val data = MutableLiveData<MutableList<Item>>()
  data.value = contentRepository
  return data
}
.
.
.

现在,两个视图模型都在对保存 MutableList 的存储库进行更改。我想知道是否可以观察另一个 viewModel 对存储库所做的更改。如果有,怎么做?

为了更清楚,我希望viewModelA 知道viewModelB 何时修改存储库中的列表。 viewModelA 可以观察存储库中的数据,以便当viewModelB 修改它时,它也会传播到viewModelA 吗?

我宁愿不使用共享视图模型。我也更愿意通过观察 LiveData 而不是使用接口来解决它

谢谢

【问题讨论】:

  • Fragment B 是否在 FragmentA 打开时打开?
  • FragmentA 始终处于打开状态。 FragmentB 可能会或可能不会打开。但是,如果FragmentB打开了,FragmentA肯定也打开了。
  • 你不能从两个视图模型中观察存储库 LiveData 吗?
  • 这正是我要问的:) 要观察我需要viewLifecycleOwner 而视图模型没有它。
  • Transformations.switchMap 是您正在寻找的。读一读吧。

标签: android kotlin android-livedata android-mvvm mutablelivedata


【解决方案1】:
// Repository
private val contentRepository = MutableLiveData<List<Item>>(Collections.emptyList())
fun getContent() : LiveData<List<Item>> = contentRepository

fun addContent(item: Item) {
    val list = ArrayList(contentRepository.value!!)
    list.add(item)
    contentRepository.value = Collections.unmodifiableList(list)
}

fun setContent(items: List<Item>) {
    contentRepository.value = Collections.unmodifiableList(ArrayList(items))
}

val cartContent: LiveData<List<Item>> = repository.getContent()

import androidx.lifecycle.observe

//FragmentA Observes viewModelA
viewModelA.cartContent.observe(viewLifecycleOwner) { content ->

}

【讨论】:

    猜你喜欢
    • 2019-03-02
    • 2014-05-08
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2020-03-16
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多