Android MVVM 2 ViewModels, совместно использующий 1 репозиторий с LiveData - PullRequest
0 голосов
/ 29 мая 2020

У меня вопрос относительно шаблона MVVM с репозиторием.

  • У меня есть активность, в которой размещены 2 фрагмента. Назовем их FragmentA и FragmentB.

  • Эти 2 фрагмента имеют свои собственные модели просмотра, такие как viewModelA и viewModelB.

  • У меня также есть класс репозитория, который обслуживает только локальные данные. Нет сетевого запроса. Просто MutableList.

  • FragmentA и FragmentB наблюдают за соответствующими viewModel через LiveData.

//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
}
.
.
.

Теперь обе модели viewModel вносят изменения в репозиторий, в котором хранится MutableList. Я хотел бы знать, можно ли наблюдать за изменениями в репозитории, которые делает другой viewModel. Если да, то как?

Чтобы быть более понятным, я хочу, чтобы viewModelA знал, когда viewModelB изменяет список в репозитории. Может ли viewModelA наблюдать за данными в репозитории, чтобы при изменении viewModelB они распространялись и на viewModelA?

Я бы предпочел не использовать общую модель просмотра. Я бы также предпочел решить это с помощью наблюдения LiveData, а не с использованием интерфейсов

Спасибо

1 Ответ

1 голос
/ 30 мая 2020
// 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 ->

}
...