Hilt 包含可用于从其他 Jetpack 库提供类的扩展。Hilt 目前支持以下 Jetpack 组件:
ViewModel
- Navigation
- Compose
- WorkManager
您必须添加 Hilt 依赖项,才能利用这些集成。如需详细了解如何添加依赖项,请参阅使用 Hilt 实现依赖项注入。
使用 Hilt 注入 ViewModel 对象
提供 ViewModel
,方法是为其添加 @HiltViewModel
注解,并在 ViewModel
对象的构造函数中使用 @Inject
注解。
@HiltViewModel
class ExampleViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
private val repository: ExampleRepository
) : ViewModel() {
...
}
@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
注解的 activity 或 fragment 可以使用 ViewModelProvider
或 by viewModels()
KTX 扩展照常获取 ViewModel
实例:
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
private val exampleViewModel: ExampleViewModel by viewModels()
...
}
@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 Navigation 库集成
请将下面这些额外的依赖项添加到 Gradle 文件中:
app/build.gradle
dependencies {
...
implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0'
}
dependencies {
...
implementation("androidx.hilt:hilt-navigation-fragment:1.0.0")
}
如果 ViewModel
的作用域限定为导航图,请使用 hiltNavGraphViewModels
函数,该函数可与带有 @AndroidEntryPoint
注解的 fragment 搭配使用。
val viewModel: ExampleViewModel by hiltNavGraphViewModels(R.id.my_graph)
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
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'
}
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")
}
注入一个 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) { ... }
@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
配置,如下所示:
@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {
@Inject lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
@HiltAndroidApp
public class ExampleApplication extends Application implements Configuration.Provider {
@Inject HiltWorkerFactory workerFactory;
@Override
public Configuration getWorkManagerConfiguration() {
return new Configuration.Builder()
.setWorkerFactory(workerFactory)
.build();
}
}