将 Hilt 与其他 Jetpack 库一起使用

Hilt 包括用于从其他 Jetpack 库提供类的扩展。Hilt 目前支持以下 Jetpack 组件

  • ViewModel
  • 导航
  • Compose
  • WorkManager

您必须添加 Hilt 依赖项才能利用这些集成。有关添加依赖项的更多信息,请参阅 使用 Hilt 进行依赖项注入

使用 Hilt 注入 ViewModel 对象

通过使用 @HiltViewModel 注解它并在 ViewModel 对象的构造函数中使用 @Inject 注解来提供一个 ViewModel

Kotlin

@HiltViewModel
class ExampleViewModel @Inject constructor(
  private val savedStateHandle: SavedStateHandle,
  private val repository: ExampleRepository
) : ViewModel() {
  ...
}

Java

@HiltViewModel
public class ExampleViewModel extends ViewModel {

  private final ExampleRepository repository;
  private final SavedStateHandle savedStateHandle;

  @Inject
  ExampleViewModel(
      SavedStateHandle savedStateHandle,
      ExampleRepository repository)
    {
    this.savedStateHandle = savedStateHandle;
    this.repository = repository;
  }
  ...
}

然后,使用 @AndroidEntryPoint 注解的活动或片段可以使用 ViewModelProviderby viewModels() KTX 扩展 以正常方式获取 ViewModel 实例。

Kotlin

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
  private val exampleViewModel: ExampleViewModel by viewModels()
  ...
}

Java

@AndroidEntryPoint
public class ExampleActivity extends AppCompatActivity {

  private ExampleViewModel exampleViewModel;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    exampleViewModel = new ViewModelProvider(this).get(ExampleViewModel.class);
  }
  ...
}

@ViewModelScoped

所有 Hilt ViewModel 均由 ViewModelComponent 提供,该组件遵循与 ViewModel 相同的生命周期,因此可以保留配置更改。若要将依赖项的作用域限定为 ViewModel,请使用 @ViewModelScoped 注解。

使用 @ViewModelScoped 类型将使作用域类型的单个实例在注入到 ViewModel 的所有依赖项中提供。ViewModel 的其他实例请求作用域实例将收到不同的实例。

如果需要在多个 ViewModel 中共享单个实例,则应使用 @ActivityRetainedScoped@Singleton 进行范围限定。

与 Jetpack 导航库集成

将以下附加依赖项添加到您的 Gradle 文件中

app/build.gradle

Groovy

dependencies {
    ...
    implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0'
}

Kotlin

dependencies {
    ...
    implementation("androidx.hilt:hilt-navigation-fragment:1.0.0")
}

如果您的 ViewModel 限定在导航图的范围内,请使用与使用 @AndroidEntryPoint 注释的片段一起工作的 hiltNavGraphViewModels 函数。

Kotlin

val viewModel: ExampleViewModel by hiltNavGraphViewModels(R.id.my_graph)

Java

NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.my_graph);

ExampleViewModel exampleViewModel = new ViewModelProvider(
  backStackEntry,
  HiltViewModelFactory.create(context, backStackEntry)
).get(ExampleViewModel.class)

与 Jetpack Compose 集成

要了解 Hilt 如何与 Jetpack Compose 集成,请参阅 Compose 和其他库 中的 Hilt 部分。

使用 Hilt 注入 WorkManager

将以下附加依赖项添加到您的 Gradle 文件中。请注意,除了库之外,您还需要包含一个在 Hilt 注解处理器之上的附加注解处理器

app/build.gradle

Groovy

dependencies {
  ...
  implementation 'androidx.hilt:hilt-work:1.0.0'
  // When using Kotlin.
  kapt 'androidx.hilt:hilt-compiler:1.0.0'
  // When using Java.
  annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0'
}

Kotlin

dependencies {
    implementation("androidx.hilt:hilt-work:1.0.0")
    // When using Kotlin.
    kapt("androidx.hilt:hilt-compiler:1.0.0")
    // When using Java.
    annotationProcessor("androidx.hilt:hilt-compiler:1.0.0")
}

使用类中的 @HiltWorker 注解和 Worker 对象构造函数中的 @AssistedInject 注入 Worker。您只能在 Worker 对象中使用 @Singleton 或无范围绑定。您还必须使用 @Assisted 注解 ContextWorkerParameters 依赖项。

Kotlin

@HiltWorker
class ExampleWorker @AssistedInject constructor(
  @Assisted appContext: Context,
  @Assisted workerParams: WorkerParameters,
  workerDependency: WorkerDependency
) : Worker(appContext, workerParams) { ... }

Java

@HiltWorker
public class ExampleWorker extends Worker {

  private final WorkerDependency workerDependency;

  @AssistedInject
  ExampleWorker(
    @Assisted @NonNull Context context,
    @Assisted @NonNull WorkerParameters params,
    WorkerDependency workerDependency
  ) {
    super(context, params);
    this.workerDependency = workerDependency;
  }
  ...
}

然后,让您的 Application 类实现 Configuration.Provider 接口,注入 HiltWorkFactory 的实例,并将其传递到 WorkManager 配置中,如下所示

Kotlin

@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {

  @Inject lateinit var workerFactory: HiltWorkerFactory

  override fun getWorkManagerConfiguration() =
      Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
}

Java

@HiltAndroidApp
public class ExampleApplication extends Application implements Configuration.Provider {

  @Inject HiltWorkerFactory workerFactory;

  @Override
  public Configuration getWorkManagerConfiguration() {
    return new Configuration.Builder()
             .setWorkerFactory(workerFactory)
             .build();
  }
}