在Android上使用MVVM时,每个Activity应该有一个(并且只有一个)ViewModel吗?

时间:2017-06-05 18:21:21

标签: android mvvm

MVVM pattern上,ViewModel包含业务逻辑,并在需要更新时通知View。关于用户事件的视图也会通知它。

据我了解,每个Model都应该有一个关联的ViewModel。所以,如果我们有以下模型:

  • 用户
  • 帐户

我们将拥有以下ViewModel:

  • UserViewModel
  • AccountViewModel

但是,我发现有关与MVVM绑定数据的所有示例,都使用单个ViewModel进行布局。最近,Google在ViewModel内推出了Architecture Components课程。这让我相信一个Activity会有一个可以连接到所有相关模型的ViewModel:

用户/帐户 - > ActivityViewModel

如果我们想到RecyclerView,这会变得更加复杂。每个适配器项目本身可以是ViewModel,因此具有RecyclerView的Activity将在列表中包含多个ViewModel,并为剩余的视图内容添加一个主模块(假设它们需要来自ViewModel的信息)。例如:

enter image description here

在此示例中,我们有一个Account ViewModel列表和一个UserViewModel。如何将其嵌入到单个ActivityViewModel中?

5 个答案:

答案 0 :(得分:6)

Google建议您按ViewModel使用1 View(即ActivityFragment)(请参阅auto-implemented-properties),然后在每个{{{}}内ViewModel 1}}您可以拥有多种类型的模型。但是,MVVM原则是每个ViewModel只有一个模型类型,因此Google的演示文稿与:/。我猜您必须决定哪种方法更适合您的应用。

关于您提及的列表示例,对于您使用https://youtu.be/Ts-uxYiBEQ8?t=8m40s的列表,这不是您的方式。您可以在我上面链接的视频的末尾看到有关如何使用此功能的详细信息。

答案 1 :(得分:2)

一个视图模型是标准的。但是,甚至谷歌建议您可能有多个视图模型。当您将电话应用程序迁移到平板电脑应用程序时,这非常方便。当您在一个选项卡视图中组合多个电话视图时,可以方便地重新使用模型。

如果在编码时牢记SOLID原则,则S(一个类的单个响应)可能会导致您使用多个视图模型。

但是,每个视图一个视图是非常标准的,如上所述,您有理由使用多个视图。

答案 2 :(得分:2)

每个视图(活动视图,片段视图或自定义视图)应该具有一个ViewModel,并具有多个LiveData,每个逻辑单元一个。在图像中,一个逻辑单元是用户数据,另一个逻辑单元是设置数据,因此您将在ViewModel中公开两个LiveData。

View with multiple LiveData

这些概念也可以在上次Google I / O中推荐的google应用程序架构中看到,其中活动/片段具有1个ViewModel和多个LiveData:

enter image description here

答案 3 :(得分:1)

用户和帐户之间有什么关系?如果这些是两个独立的,不相关的模型,那么它们应该各自拥有自己的视图和视图模型。记住单一责任原则:每个模块应仅负责逻辑的单个部分。这样,对域逻辑或模型的任何更改都只会影响该部分,而只会影响该部分。

答案 4 :(得分:0)

如果活动中有不同的片段...对每个片段使用不同的ViewModel ...如果对所有片段使用相同的ViewModel,则可能会丢失数据...