Android ViewModel的职责是仅保留数据还是保留数据+用于视图的控制器?

问题描述 投票:1回答:1

official我们知道

ViewModel类旨在以生命周期感知的方式存储和管理与UI相关的数据

但是我认为许多开发人员都将ViewModel用作数据存储和控制器(例如,调用存储库,数据的网络客户端)。我也将数据存储和控制器都用作视图。

Android官方示例代码也具有一些控制器逻辑。从official

class MyViewModel : ViewModel() {
  private val users: MutableLiveData<List<User>> by lazy {
     MutableLiveData().also {
        loadUsers()
     }
  }

  fun getUsers(): LiveData<List<User>> {
    return users
  }

  private fun loadUsers() {
    // Do an asynchronous operation to fetch users.
  }
}

这里loadUsers可以调用某些RepositoryNetworkClient。所以在这里它像控制器一样。

我确信很多开发人员都这样做,但是从定义ViewModel开始,应该存储和管理与UI相关的数据,ViewModel应该充当Controller吗?

我发现了一些关于此的stackoverflow线程thisthis

第一个接受的答案建议不要将ViewModel用作Controller,而将Controller用作其他任务。

在第二篇@commonsware的注释部分中,还建议不要使用数据以外的复杂事物。

所以我的问题是

  1. 根据建筑概念,ViewModel的实际责任是什么?
  2. 如果我必须执行一些与View相关的方法调用(例如数据查询,网络调用和其他与业务登录相关的东西,该怎么办?
  3. 并且如果我必须使用Controller,那么我如何连接ViewController进行设备旋转并在Fragment之间共享控制器?

希望我的问题对所有人都清楚

提前感谢。

android android-architecture-components android-viewmodel android-mvp
1个回答
0
投票

这里loadUsers()可以调用某些存储库或NetworkClient。所以在这里它就像控制器一样。

我确信很多开发人员都这样做,但是从定义上看,ViewModel应该存储和管理与UI相关的数据,ViewModel应该充当Controller吗?

[理论上,数据检索应在LiveData内部,由active observers触发,并基于此决定要做什么(在onActive()中)。如果LiveData实际上是MediatorLiveData,那么这也适用于与addSource绑定的任何块,因为仅当活动观察者观察到MediatorLiveData时,才调用添加有addSourceMediatorLiveData的块

您可以在the NetworkBoundResource中充分了解此技术。 ViewModel仅存储数据,不知道数据加载。

从架构概念上,ViewModel的实际责任是什么?

[如果您看到Yigit Boyar(NetworkBoundResource的创建者)的评论:

我是添加了它的人(或者是团队的一部分),与MVVM无关。所有这些都是关于尝试给需要放置数据的人提供一个类。

AAC不是MVVM实现,也不是VM概念仅作为MVVM的一部分。

实际上,这样做的主要动机是;我们一直在告诉开发人员不要在UI控制器中管理数据,答案也是,所以在哪里?然后ViewModel成为了答案。

我们希望它成为您的视图层(片段,活动等)的模型。事后看来,最好选择一个新名称,但命名确实很难。

结论:ViewModel是MVC方案中的Model,其中ViewModel是活动或片段,C是展开视图,VM

如果我必须执行一些与View相关的方法调用(例如数据查询,网络调用和其他与业务登录相关的东西,该怎么办?

ViewModel以LiveData的形式获取数据,并且通过以给定的生命周期从View进行观察来“激活” LiveData。

网络调用也应该以相同的方式触发(如果您按照LiveData的设计方法进行操作。

理论上,如果您有一个登录调用,您也可以在控制器中而不是模型中进行,因此您[[可以在Fragment中进行,即使有诸如Jetpack Databinding之类的技巧可以使您可以直接从XML的“模型视图”中调用方法。

并且如果我必须使用Controller,那么我如何连接View和Controller进行设备旋转并在Fragment之间共享控制器?

ViewModel公开ViewModel,也可能公开LiveData,两者都不是Command绑定),并且View或Controller可以在必要时直接在其上调用方法。 ViewModel存储在配置更改中(而不是在进程终止时存储),因此它不应保存直接的视图引用。

© www.soinside.com 2019 - 2024. All rights reserved.