MVVM + 数据绑定

MVVM + Databinding

假设我有一个天气应用程序,我在其中从数据提供程序获取数据并将其保存在我的本地数据库中。现在我有一个 Repository class,它的工作是根据特定条件从 API 或本地数据库中获取数据。我有一个设置页面,用户选择以 °F 为单位显示温度,以公里为单位显示距离。我从 API 得到的数据是 °C 的温度和 mi 的距离。我的 View 请求 ViewModelRepository 获取数据。 Repository 获取数据并返回一个名为 WeatherData 的模型。现在我拥有的数据以 °C 和 mi 为单位。使用 DataBinding 我在我的布局文件中导入 Util class 是否是个好主意,其中包含根据用户在设置中选择的转换这些单位的帮助方法?或者 WeatherData 中是否应该有方法可以转换数据并使用数据绑定显示在视图中?或者是否有其他人以正确的方式做到这一点?

所以你想做的是根据你的设置,你必须显示 °C/°F 和 mi/km。

您可以在模型中使用转换逻辑 class WeatherData

喜欢,

class WeatherData{

    private float degrees;

    public float getCelsius(){
        //conversion
    }

    public float getFahrenheit(){
        //conversion
    }

    private float km;

    public float getKm(){
        //conversion
    }

    public float getMiles(){
        //conversion
    }

} 

并且在您的视图模型中,您可以拥有像 boolean celsius,km;

这样的标志

在布局中你可以定义这三个变量。

    <data>
        <variable
            name="celsius"
            type="Boolean"/>
        <variable
            name="km"
            type="Boolean"/>
        <variable
            name="data"
            type="WeatherData"/>
    </data>
    <TextView
        android:id="@+id/tv_distance"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{km?data.km:data.miles}" />
    <TextView
        android:id="@+id/tv_temperature"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{celsius?data.celsius:data.fahrenheit}"
        />

这是一个有趣的问题,可能会有不同的答案,但我会就此事提出自己的看法。

查看 ViewModel 的一种方法是将其视为视图的 'model'。通过这种方式,您可以确定您的视图将非常精简和虚拟,这是理想的,因为它们可能很难(如果不是不可能的话)测试。由于 VM 也是视图和模型之间的层,因此它是进行数据和类型转换的理想场所。好处包括可测试性(正如我所说,很难在 XML 中验证转换逻辑)和更好的可维护性(如果由于某种原因您将来必须更改视图)。

要考虑的另一点是干净的架构。在干净的架构中,依赖是向内的。上层模型应该映射到下层模型或从下层模型映射。在你的情况下,Repository 已经达到了提供 WeatherData 的目的,它不应该关心数据将如何在上层使用。

所以为了回答你的问题,我认为它应该在 ViewModel 中,或者如果你想在不同视图中进行多次转换的情况下进一步分离,你的域之间的 Converter 层图层和 ViewModel。