定义 ViewModel class 的更好的 MVVM 方法是什么?

What is the better MVVM approach to define a ViewModel class?

我看过很多 MVVM 教程。他们中的大多数人说您需要像这样定义 ViewModel class:

class MainViewModel: ViewModel() {
    ...
}

但最近我从 Google 中偶然发现了 Dagger tutorial project。有一个不同的 ViewModel class 定义:

class MainViewModel(private val userDataRepository: UserDataRepository) {
    ...
}

所以我想知道,这两种方法有什么区别?

这不是一个相关的比较。该 CodeLab 使用非 ViewModel ViewModel class 来简化他们对 DI 工作原理的解释。请注意,它没有 subclass ViewModel。此外,该项目在没有依赖项注入的情况下启动,并在稍后添加它,因此启动项目并不是如何设计某些东西的一个很好的例子。

无论哪种方式,如果您有一个存储库,您需要通过某种方式在您的 ViewModel 中获取对存储库的引用。如果是通过构造函数,您将必须在为此 class 构建的关联 ViewModelFactory 中获取对存储库的引用。如果你使用 Dagger,你可能会让 Dagger 为你生成这个工厂并注入引用。

如果您的 ViewModel 不使用存储库,那么您将没有任何理由在构造函数中使用存储库,无论是否有依赖注入。许多基本的 MVVM 教程将从最基本的示例开始,一个不需要参数的 ViewModel。这并不意味着 ViewModel 永远不应该有依赖关系。