将 Hilt 和其他 Jetpack 库一起使用

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 可以使用 ViewModelProviderby 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 或未限定作用域的绑定。您还必须使用 @AssistedContextWorkerParameters 依赖项添加注解:

@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()
}