为什么要使用 AndroidViewModel?

Why using AndroidViewModel?

我阅读了很多从 AndroidViewModel 派生的 ViewModel,这当然需要一个应用程序引用。

class SomeViewModel(application: Application) : AndroidViewModel(application) 
  1. 但是为什么要这样做呢?看到应用程序移交给 ViewModel 令我很伤心。什么是可接受的用例?
  2. 如果有任何理由使用 AndroidViewModel,是否可以不从 ViewModel 派生 + 使用 dagger2 进行应用程序注入?

因为它需要应用程序引用,所以它可以提供有用的上下文(例如:用于系统服务)。

参见 -

并非所有的代码库都是一样的。 AndroidViewModel 可以成为在没有很多抽象或分层的“遗留”代码库中进行增量重构的有用工具(阅读:Activity/Fragment 上帝对象)。

作为来自“遗留”代码库的桥梁,在这种情况下使用它是有意义的。

  1. But why would one do this? It hurts me to see application handed over to ViewModel. What would be an acceptable use case for this?

AndroidViewModel 的用例是访问 Application。在“遗留”代码库中,将“Context/Application-dependent 代码”移出 Activities 和 Fragments 是相对安全的,无需进行冒险的重构。在这种情况下,需要在视图模型中访问 Application

  1. If there is any reason to use AndroidViewModel, can one not derive from ViewModel + use dagger2 for the application inject?

如果您没有注入任何其他东西,那么充其量这是一种获取 Application 引用的便捷方式,而无需键入强制转换或根本不使用任何 DI。

如果您要注入其他成员,无论是使用 DI 框架还是 ViewModelFactory,这是一个偏好问题。

如果您将 ViewModel 直接注入您的 Activity/Fragment,您将失去平台为您提供的好处。您必须手动确定 VM 的生命周期范围,并为 UI 的生命周期手动清除 VM,除非您还弄乱了 ViewModelStores 或任何其他涉及保留的组件。那时,它只是名称上的视图模型。