我是MVVM模式的新手,这对我来说是一个普遍的问题,但我将使用一个具体的例子。
我有:
Place
,包含纬度,经度,名称等。MapsViewModel
,其中包含LiveData<List<Place>>
使用的地方列表MapsFragment
MapsFragment
的View
。根据我的理解,View
应该忘记Model
,在这种情况下,MapsFragment
不应该知道Place
模型。
我想用标记填充地图,但标记需要纬度和经度(以及其他参数,如名称等),所以我应该观察地点列表并将列表中的每个条目映射到它的标记。
我不确定是否应该将位置映射到MapsViewModel
内的标记,以便MapsFragment
可以调用mapsViewModel.getMarkers()
并使用该标记列表填充地图,或者MapsFragment
应该观察mapsViewModel.getPlaces()
并从响应映射列表到标记,然后填充地图。
如果MapsViewModel
应该负责映射地点,如果添加了新的位置,我将如何观察LiveData
的变化?
如果MapsFragment
应该负责映射那么不会打破那些Views
不应该知道模型的MVVM模式吗?
这个例子是用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()
}
...
附: ListViews和其他集合类型的一个问题:每个单元格都应该有自己的ViewModel
,还是整个ListView只有一个ViewModel
?
在MVVM架构中,ViewModel
公开了与View
相关的数据流。所以你的View
绝对应该遵守Place
的名单。
如果MapsFragment应该负责映射,那么不会破坏视图不应该知道模型的MVVM模式吗?
我们很好,只要View
没有直接交互/更改数据层(Model
)并且只从ViewModel
获取所有可显示的信息。
一般的经验法则是,
ViewModel
暴露的数据流应该足够简单,可以被View
直接使用。
希望这能回答你的问题。