视图或视图模型是否负责将数据从模型转换为要在 UI 中呈现?



我是MVVM模式的新手,这对我来说是一个一般性问题,但我将使用一个具体的例子。

我有:

  • 包含纬度、经度、名称等的数据类Place
  • 包含MapsFragment使用的地点列表LiveData<List<Place>>MapsViewModel
  • 以及表示 MVVM 模式ViewMapsFragment

根据我的理解,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消费。

希望能回答你的问题。

相关内容

  • 没有找到相关文章