Я новичок в модели MVVM, и это общий вопрос для меня, но я буду использовать конкретный пример.
Я имею:
Place
который содержит широту, долготу, имя и т.д.MapsViewModel
который содержит список мест LiveData<List<Place>>
используемый MapsFragment
MapsFragment
, который представляет собой View
узора MVVM. MapsFragment
я понимаю, View
должно не учитывать Model
, в этом случае MapsFragment
не должен знать о модели Place
.
Я хочу заполнить карту маркерами, но маркерам нужны широта и долгота (и другие параметры, такие как имя и т.д.), Поэтому я должен наблюдать за списком мест и сопоставлять каждую запись в списке с маркером.
Я не уверен, должен ли я разместить код для сопоставления мест с маркерами внутри MapsViewModel
чтобы MapsFragment
мог просто вызывать mapsViewModel.getMarkers()
и использовать этот список маркеров для заполнения карты, или должен ли MapsFragment
наблюдать mapsViewModel.getPlaces()
и от карты ответа список до маркеров, а затем заполните карту.
Если предполагается, что MapsViewModel
отвечает за сопоставление мест, как я буду наблюдать за изменениями в LiveData
при добавлении новых мест?
Если предполагается, что MapsFragment
отвечает за отображение, то не нарушает ли это шаблон MVVM, когда Views
не должны знать о модели?
Пример написан на Kotlin
но я не пометил вопрос с Kotlin
потому что он не зависит от языка.
В моих текущих реализациях я наблюдаю за местами LiveData<List<Place>>
// MapsFragment
...
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
mapsViewModel.getPlaces().observe(this, Observer { places ->
places?.forEach { place ->
var options = MarkerOptions()
options.position(LatLng(place.lat.toDouble(), place.lon.toDouble()))
mMap.addMarker(options)
}
})
}
...
// MapsViewModel
...
fun getPlaces(): LiveData<List<Place>> {
return Repositories.placesRepository.getPlaces()
}
...
PS Один боковой вопрос для ListViews и других типов коллекций: должна ли каждая ячейка иметь собственную ViewModel
или весь ListView должен иметь только одну ViewModel
?
В архитектуре MVVM ViewModel
предоставляет поток данных, относящихся к View
. Таким образом, ваш View
обязательно должен соблюдать список Place
.
Если предполагается, что MapsFragment отвечает за отображение, то не нарушает ли это шаблон MVVM, когда представления не должны знать о модели?
У нас все хорошо, если View
не взаимодействует напрямую/не изменяет слой данных (Model
) и не получает всю отображаемую информацию только из ViewModel
.
Общее правило:
Поток данных, предоставляемый ViewModel
должен быть достаточно простым для непосредственного использования View
.
Надеюсь это ответит на твой вопрос.