我是MVVM模式的新手,这对我来说是一个一般性问题,但我将使用一个具体的例子。
我有:
- 包含纬度、经度、名称等的数据类
Place
。 - 包含
MapsFragment
使用的地点列表LiveData<List<Place>>
MapsViewModel
- 以及表示 MVVM 模式
View
的MapsFragment
。
根据我的理解,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()
}
...
附言 列表视图和其他集合类型的一个侧面问题: 每个单元格都应该有自己的ViewModel
还是整个列表视图只有一个ViewModel
?
在 MVVM 体系结构中,ViewModel
公开与View
相关的数据流。所以你的View
绝对应该遵守Place
列表。
如果 MapsFragment 应该负责映射,那么 这不会破坏视图不应该知道的 MVVM 模式吗 模型?
我们很好,只要View
不直接交互/更改数据层(Model
)并仅从ViewModel
获取所有可显示的信息。
一般的经验法则是,ViewModel
公开的数据流应该足够简单,可以直接被View
消费。
希望能回答你的问题。