ViewModelComponent 是一个 Hilt 组件层次结构 (Component hierarchy) 中的一员,它遵循 ViewModel 的生命周期,并可以限定类型的作用域到此组件上。
Hilt 组件层次结构 (Component hierarchy)
https://developer.android.google.cn/training/dependency-injection/hilt-android#component-hierarchy
在 ViewModelComponent 添加到 Hilt 之前,ViewModel 类通过 ActivityRetainedComponent 创建和注入。因此,ViewModel 中的依赖项仅可以使用未限定作用域、或是将作用域限定到 SingletonComponent 或 ActivityRetainedComponent 中,被所有 ViewModel 共享实例的类型。
如果您的 App 每个页面都仅为一个 Activity,上述内容并不会成为问题,因为此情况中将类型的作用域限定为 ActivityRetainedComponent 意味着每个页面的 ViewModel 类都将获得该类型的不同实例。然而,每个页面仅为一个 Activity 并不适用于大多数 App。
此外,ActivityRetainedComponent 组件不会默认绑定 SavedStateHandle。
现在,您可以通过遵循 ViewModel 生命周期的 ViewModelComponent 组件来创建并注入 ViewModel。每一个 ViewModel 实例持有不同的 ViewModelComponent 实例,您可以使用 @ViewModelScoped 注解,将类型的作用域限定到该组件上。
ViewModelComponent 在精简版 Hilt 组件层次结构中的位置
ViewModelComponent 继承自 ActivityRetainedComponent,因此它的类型限定依赖于上层的 SingletonComponent 和 ActivityRetainedComponent。除此之外,ViewModelComponent 还默认绑定了一个与 ViewModel 关联的 SavedStateHandle。
SavedStateHandle
https://developer.android.google.cn/reference/androidx/lifecycle/SavedStateHandle