【问题标题】:Get data based on the user's query and pass it to databinding [uses MVVM]根据用户的查询获取数据并传递给数据绑定[使用MVVM]
【发布时间】:2023-04-03 21:29:01
【问题描述】:

我有一个数据库,其中包含英制和公制单位的天气数据。现在,我创建了两个不同的类,它们作为模型从数据库中获取数据。 CurrentWeatherMetric 只有公制列,CurrentWeatherImperial 只有英制字段。

由于我使用的是 MVVM 架构模式,ViewModel 通过调用 ViewModel 中的函数getData(Unit.METRIC) 为我提供了这些数据,其中Unit 是我用来区分数据的enum class

问题就出现在这里。 我的 viewModel 看起来像:

class WeatherViewModel(
    private val weatherRepository: WeatherRepositoryImpl
) : ViewModel() {

    lateinit var currentWeather: LiveData<CurrentWeather>
    lateinit var forecastWeather: LiveData<List<ForecastWeather>>

    fun getValuesOfUnit(unit: Unit) {
        currentWeather = when (unit) {
            Unit.IMPERIAL->weatherRepository.getCurrentWeatherImperial()
            Unit.METRIC->weatherRepository.getCurrentWeatherMetric()
        }
        getWeather()
    }

    private fun getWeather() {

        viewModelScope.launch {
            try {
                weatherRepository.getWeather()
            } catch (e: IOException) {

            }
        }
    }
}

如您所见,lateinit var currentWeather: LiveData&lt;CurrentWeather&gt;, 我不得不创建另一个类来存储带有单位的查询数据。我这样做是为了可以轻松地用它实现数据绑定。但我觉得这是一种非常错误的做事方式,因此我提出了这个问题。如何摆脱 lateinit 变量并实现数据绑定以适应任何数据。

在我当前的数据绑定布局中,我的数据字段为:

<data>
    <variable
        name="viewModel"
        type="com.mythio.weather.ui.WeatherViewModel" />
</data>

我通过以下方式绑定到视图:

   app:someattribute="@{viewModel.currentWeather.temperature}"

如果问题标题对我所问的内容有点意义,或者似乎具有误导性,请随时对其进行编辑以使其成为更好的问题。

【问题讨论】:

  • 尽管使用了 lateinit,您也可以使用 MutableLiveData 在同一行中使用类似 val data: LiveData&lt;&gt; = MutableLiveData() 的声明对其进行初始化。虽然 UI 绑定对我来说似乎没问题。
  • 那么我实现其余代码的方式还可以吗?
  • 是的,我认为遵循 MVVM 并从存储库获取数据是最佳实践。推荐的方法是将您的 ViewModel 绑定到 UI 并从存储库中获取数据,这始终是您数据的单一真实来源。
  • 好的,谢谢!如果你写一个答案,我会把它标记为正确
  • 但我并没有帮助你获得这样的声誉。

标签: android kotlin mvvm android-room android-livedata


【解决方案1】:

在使用 MVVM 架构模式时,Google 推荐的方法是让 ViewModel 处理您的数据和视图之间的连接,因此它包含 UI 逻辑以及绑定到 UI 的部分业务逻辑。

此外,以推荐的方式实施ViewModel 可以帮助您以更好、更轻松的方式处理UI 生命周期(活动/片段)。

当使用数据绑定与 MVVM 时,最好将ViewModel 直接绑定到 xml,这样,当数据更改时,您可以使用 LiveData 无需手动接线。

因此,LiveData 可以用作数据值持有者,因为它也是生命周期感知组件


另一方面,存储库是管理业务逻辑并为通过应用程序驱动的数据提供“单一事实来源”的好方法.因此,local-db、API 调用、共享首选项 等所有数据源都应通过存储库访问。

所以,是的!在遵循 MVVM 架构模式的同时,您所做的事情都很好,并且您走在正确的轨道上。

注意:您可以参考 here 了解更多信息和代码中的一些改进。

【讨论】:

    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多