【问题标题】:Activity with multiple ViewModels具有多个 ViewModel 的 Activity
【发布时间】:2017-09-21 09:22:07
【问题描述】:

我有一个包含 3 个RecyclerViewsActivity。我需要使用来自远程存储库的数据(3 个不同的请求)填充RecyclerViews。我可以在Activity 中使用多个ViewModels,还是有更好的解决方案(最佳实践)。

【问题讨论】:

  • Google 的 AAC 样本显示使用 1 个 RecyclerViews 和 1 个 LiveData。如果您尝试使用 3 个 LiveDatas 执行 3 个 RecyclerViews,会出现什么问题

标签: android viewmodel android-architecture-components


【解决方案1】:

根据the open/closed principle,你应该创建三个不同的ViewModels。复杂性并没有增加那么多,而且您可以很容易地将带有相应RecyclerViewViewModel(或只是重复使用它)移动到另一个Activity

当然,有时打破规则是有道理的——例如,如果您知道RecyclerView 不会被重复使用或移动到另一个屏幕,那么您可以使用ViewModel 寻求更简单的解决方案。

同样的情况,如果ViewModel(即使有 3 个列表)可能总是非常简单(只有三个 LiveData 字段,只需几行代码来填充它们),你可以打破这个规则。

然而,违反 O/CP 并不是一个好的做法 - 这只是有意识地违反规则。

【讨论】:

  • ViewModels 可以相互通信吗?假设一个ViewModelLiveData 对象,它在另一个ViewModel 中触发LiveData。在Activity 中将它们捆绑在一起似乎是错误的,那么你会怎么做呢?
  • 我不知道您的用例是什么,但总的来说,我会避免将一个 ViewModel 连接到另一个。我宁愿创建另一个对象并将它的相同实例注入ViewModels。当然,这第三个公共对象也可以将LiveData 作为成员,其中一个ViewModel 可以更新,另一个 - 观察。如果您需要更详细的信息,请发布一个新问题,我很乐意回答。
【解决方案2】:

在这种情况下,我建议使用一个填充三个不同 LiveData 对象的视图模型。这样,只要您的三个请求之一得到响应,UI 就可以更新。有关如何将 RecyclerView 与 LiveData 一起使用的详细信息,请查看Google Example

我认为每个活动有多个视图模型只会增加复杂性,我认为这样做没有任何价值。

【讨论】:

  • Google 示例链接已失效。
  • @guglhupf 这样做有一个价值:减少RecyclerViews 之间的耦合并增加独立重用它们或移动到另一个屏幕的能力。
【解决方案3】:

我在一个片段中有两个 recyclerview。我认为使用两个 ViewModel 会更好。导致不同的recyclerviews有自己的数据请求,状态处理尤其是连接错误。 在这种情况下,分成不同的 ViewModel 不会增加复杂性,但我认为它很符合 deupling 的规则

【讨论】:

    【解决方案4】:

    更简单的是,您可以拥有一个 ViewModel,它使用一个服务类,而后者又使用三个存储库来获取数据。例如:

    XActivity --> XViewModel --> XService --> {Arepository, Brepository, Crepository}

    【讨论】:

    • 此解决方案将使ActivityViewModelService 之间的耦合非常高,因此将一个RecyclerViewXActivity 移动到YActivity 会很困难。
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2023-03-11
    • 2019-09-10
    • 1970-01-01
    • 2012-09-25
    • 2016-01-04
    相关资源
    最近更新 更多