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
注解的活动或片段可以使用 ViewModelProvider
或 by 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 文件中
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 注解处理器之上的附加注解处理器
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
注解 Context
和 WorkerParameters
依赖项。
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(); } }