MVVM 架构 Android

3

我有一个活动(Activity)并为其创建了一个View-Model(视图模型)。我创建了不同的类,如:UiUtil(显示、隐藏视图、隐藏键盘),网络层(Network Layer),数据库层(Data Base Layer),AppUtil(用于通用功能比如集合检查、字符串验证、日期转换等)。

我的问题是,在MVVM(Model View ViewModel)设计模式中,Activity能否直接使用这些实用程序类或者需要通过View-Model来使用这些类?如果是通过 View-Model,则在View-Model中我需要编写一个方法,仅调用实用程序类的某个方法。例如以下TimeDateManager是View-Model中使用的实用程序类:

class HomeViewModel: BaseViewModel() { fun prepareTimeAmPmToDisplay(context: Context, alarm: Alarm): String { return TimeDateManager.prepareTimeAmPmToDisplay(context, alarm) } }

1
通常由ViewModel使用这些类。在MVVM中,Activity是View,因此它应该是愚蠢的,只关心显示内容。另外,我建议您研究依赖注入,以便从ViewModel中以清晰的方式使用这些类(例如:不必传递上下文)。 - Nicolas
谢谢Nicolas,但是在这种方法中,我们需要在视图模型内编写不必要的方法。正如我在示例中提到的那样,我也可以直接在活动中使用TimeDateManager.prepareTimeAmPmToDisplay(context, alarm)方法。将其视为具有许多常用方法的Util类,在这种方法中,我们需要在视图模型内定义方法,然后视图模型根据需要使用这些Util类方法。 - User10001
1
@User10001 我建议你看一下这个MVVM示例repo,因为它严格遵循MVVM原则。 - theapache64
2个回答

5

架构不是必须的,它们是建议性的,因此您可以在相当广泛的范围内更改它们的使用。唯一的限制应该是常识(当然,如果有的话)。

在这种情况下,根据您的ViewModel构造和其与View(即Activity)通信的方式,使用实用类可能是可以的。

例如,如果您的ViewModel中有一些LiveData向View发送某种事件(例如从后端加载的数据或触发的警报),并且您的View监听它,我认为在Activity中的Observer中使用util类是可以的。特别是如果此utils方法不依赖于任何ViewModel或Repository数据。直接在Activity中使用utils的用法不仅限于此用例-还有很多其他用途。

我明白这可能是现代“清洁方法”中不受欢迎的意见,但我相信,这种“清洁方法”有时会使一些本应简单的事情变得复杂,因此,如果混合一些东西不会破坏整体架构,而是使某些东西更易读和维护-我会选择这样做。

希望这有所帮助。


2
我的MVVM方法很简单,ViewModel负责业务逻辑,处理存储库(网络、数据库等)和所有非UI代码,为UI准备所需的数据,就像文档中所述:
“ViewModel对象为特定的UI组件(如片段或活动)提供数据,并包含用于与模型通信的数据处理业务逻辑。例如,ViewModel可以调用其他组件加载数据,并且它可以将用户请求转发到修改数据的组件。 ViewModel不知道UI组件,因此不受配置更改的影响,例如在旋转设备时重新创建活动。”
另一方面,ViewModels不应存储上下文(ApplicationContext是例外),最好根本不使用Android API,以使它们更易于测试(尤其是在纯单元测试的情况下)。
我们还建议在ViewModels中使用LiveData,并且UI必须观察LiveData。例如,在Activity的onCreate中,您将从VM调用loadMainContent()方法,它将从存储库调用getMainContent(page = 1),存储库将决定从DB或网络加载数据,并将结果设置为LiveData,View正在侦听更改。
有时候,甚至最好从View而不是VM调用这些实用程序。我对您的UiUtil非常确定,我认为TimeDateManager更多地涉及视图而不是逻辑。此外,如果通过存储库(负责缓存等)调用网络和DB层,则更有效率,VM可以使用该存储库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接