View或ViewModel是否负责将模型中的数据转换为在UI中呈现?

问题描述 投票:1回答:1

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

我有:

  • 数据类Place,包含纬度,经度,名称等。
  • 一个MapsViewModel,其中包含LiveData<List<Place>>使用的地方列表MapsFragment
  • 还有一个代表MVVM模式的MapsFragmentView

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

android google-maps design-patterns mvvm viewmodel
1个回答
2
投票

在MVVM架构中,ViewModel公开了与View相关的数据流。所以你的View绝对应该遵守Place的名单。

如果MapsFragment应该负责映射,那么不会破坏视图不应该知道模型的MVVM模式吗?

我们很好,只要View没有直接交互/更改数据层(Model)并且只从ViewModel获取所有可显示的信息。

一般的经验法则是, ViewModel暴露的数据流应该足够简单,可以被View直接使用。

希望这能回答你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.