将 Hilt 和其他 Jetpack 库一起使用

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

  • ViewModel
  • Navigation
  • Compose
  • WorkManager

您必须添加 Hilt 依赖项,才能利用这些集成。如需详细了解如何添加依赖项,请参阅使用 Hilt 实现依赖项注入

使用 Hilt 注入 ViewModel 对象

提供 ViewModel,方法是为其添加 @HiltViewModel 注解,并在 ViewModel 对象的构造函数中使用 @Inject 注解。

KotlinJava
@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 可以使用 ViewModelProviderby viewModels() KTX 扩展照常获取 ViewModel 实例:

KotlinJava
@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

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

如果 ViewModel作用域限定为导航图,请使用 hiltNavGraphViewModels 函数,该函数可与带有 @AndroidEntryPoint 注解的 fragment 搭配使用。

KotlinJava
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

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

KotlinJava
@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 配置,如下所示:

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