Hilt 包含可用于从其他 Jetpack 库提供类的扩展。Hilt 目前支持以下 Jetpack 组件:
- 写邮件
ViewModel- 导航
- WorkManager
您必须添加 Hilt 依赖项,才能利用这些集成。如需详细了解如何添加依赖项,请参阅使用 Hilt 实现依赖项注入。
与 Jetpack Compose 集成
如需了解 Hilt 如何与 Jetpack Compose 集成,请参阅 Compose 和其他库的“Hilt”部分。
使用 Hilt 注入 ViewModel 对象
提供 ViewModel,方法是为其添加 @HiltViewModel 注解,并在 ViewModel 对象的构造函数中使用 @Inject 注解。
@HiltViewModel class ExampleViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { ... }
然后,带有 @AndroidEntryPoint 注解的 activity 可以使用 ViewModelProvider 或 by viewModels() KTX 扩展照常获取 ViewModel 实例:
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
将辅助注入与 ViewModel 搭配使用
Hilt 支持对 ViewModel 进行辅助注入。借助辅助注入,您可以注入动态运行时实参以及 Hilt 管理的依赖项。如需使用辅助注入,请使用 @AssistedInject 注解 ViewModel 构造函数,并使用 @Assisted 标记动态参数。您还必须定义一个 @AssistedFactory 接口,该接口充当桥梁,供 Hilt 自动生成必要的 @ViewModelProvider.Factory。
@HiltViewModel(assistedFactory = MyViewModel.Factory::class) class MyViewModel @AssistedInject constructor( @Assisted val userId: String, private val repository: MyRepository ) : ViewModel() { @AssistedFactory interface Factory { fun create(userId: String): MyViewModel } }
在 Compose 中,您可以在 Navigation 或屏幕初始化期间将辅助工厂传递给 hiltViewModel 函数,从而使用辅助工厂。此方法无需手动设置工厂样板,同时可确保 ViewModel 正确限定到 Navigation 返回堆栈。如需了解详情,请参阅有关 辅助注入的 Hilt 文档。
@ViewModelScoped
所有 Hilt ViewModel 都由 ViewModelComponent 提供,后者遵循与 ViewModel 相同的生命周期,因此可以在配置更改后继续存在。如需将依赖项的作用域限定为 ViewModel,请使用 @ViewModelScoped 注解。
使用 @ViewModelScoped 类型后,系统会在注入 ViewModel 的所有依赖项中提供限定了作用域的类型的单个实例。请求限定了作用域的类型的 ViewModel 的其他实例会收到其他实例。
如果需要在不同 ViewModel 之间共享单个实例,则应使用 @ActivityRetainedScoped 或 @Singleton 限定其作用域。
与 Jetpack Navigation 库集成
请将下面这些额外的依赖项添加到 Gradle 文件中:
app/build.gradle
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0") }
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0' }
在 Jetpack Compose 中,Navigation Compose 库和 Navigation 3 库都使用 hiltViewModel 函数自动检索作用域限定为当前导航目的地的 ViewModel。
在 Navigation 3 中,导航目的地由 NavEntry 表示。使用 rememberViewModelStoreNavEntryDecorator 将 ViewModel 的作用域限定为 NavEntry。在相应 NavEntry 的提供程序中使用 hiltViewModel 来检索关联的 ViewModel。
NavDisplay(..., entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()), entryProvider = entryProvider { entry{ key -> val viewModel = hiltViewModel () MyScreen(viewModel = viewModel) } } )
在 Navigation Compose 中,ViewModel 会自动限定为导航目的地。如需了解详情,请参阅 Hilt 和 Navigation。
val viewModel = hiltViewModel()
使用 Hilt 注入 WorkManager
将下面这些额外的依赖项添加到 Gradle 文件中。请注意,除了库之外,您还需要添加一个额外的注释处理器,它在 Hilt 注释处理器的基础上运行:
app/build.gradle
Kotlin
dependencies { implementation("androidx.hilt:hilt-work:1.0.0") // When using Kotlin. ksp("androidx.hilt:hilt-compiler:1.3.0") }
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-work:1.0.0' // When using Kotlin. ksp 'androidx.hilt:hilt-compiler:1.3.0' }
注入一个 Worker,方法是在类中使用 @HiltWorker 注解,并在 Worker 对象的构造函数中使用 @AssistedInject。您只能在 Worker 对象中使用 @Singleton 或未限定作用域的绑定。您还必须使用 @Assisted 为 Context 和 WorkerParameters 依赖项添加注解:
@HiltWorker class ExampleWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, workerDependency: WorkerDependency ) : Worker(appContext, workerParams) { ... }
然后,让 Application 类实现 Configuration.Provider 接口,注入 HiltWorkFactory 的实例,并将其传入 WorkManager 配置,如下所示:
@HiltAndroidApp class ExampleApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }