Hilt 是推荐用于在 Android 中实现依赖项注入的 Jetpack 库。Hilt 定义了一种在应用中实现 DI 的标准方法,它会为项目中的每个 Android 类提供容器并自动为您管理其生命周期。

Hilt 在热门 DI 库 Dagger 的基础上构建而成,因而能够受益于 Dagger 提供的编译时正确性、运行时性能、可伸缩性和 Android Studio 支持。

Hilt 允许非Android接受注入,也允许外部库作依赖项。


Hilt作用于两种类:依赖项(应用类:提供应用application级组件)和接受注入的类

Hilt支持的Android 类,@AndroidEntryPoint 会为项目中的每个 Android 类生成一个单独的 Hilt 组件。这些组件可以从它们各自的父类接收依赖项,如组件层次结构中所述。

Application @HiltAndroidApp
ViewModel @HiltViewModel
Activity AppCompatActivity 仅扩展 ComponentActivity 的 activity
Frament 扩展 androidx.Fragment 的 Fragment,不支持保留的 fragment。
View
Service
BroadcatReceiver

Hilt 模块

定义Hilt绑定 - 构造函数注入

class AnalyticsAdapter @Inject constructor(
  private val service: AnalyticsService
) { ... }

组件默认绑定:

每个 Hilt 组件都附带一组默认绑定,Hilt 可以将其作为依赖项注入您自己的自定义绑定。请注意,这些绑定对应于常规 activity 和 fragment 类型,而不对应于任何特定子类。这是因为,Hilt 会使用单个 activity 组件定义来注入所有 activity。每个 activity 都有此组件的不同实例。

Android 组件 默认绑定
SingletonComponent Application
ActivityRetainedComponent Application
ViewModelComponent SavedStateHandle
ActivityComponent ApplicationActivity
FragmentComponent ApplicationActivity 和 Fragment
ViewComponent ApplicationActivity 和 View
ViewWithFragmentComponent ApplicationActivityFragmentView
ServiceComponent ApplicationService

上下文绑定:@ApplicationContext 获得应用上下文绑定;@ActivityContext 获得 activity 上下文绑定

Hilt绑定的更一般方法是Hilt模块(不通过构造函数注入的情况:接口,来自外部库的类)

注意:不同层级、@provide和@bind都要放在不同的模块中(使用不同的/package/di 下的*kt文件)

| 在 Hilt 模块内创建一个函数,并使用 @Provides 为该函数添加注解。 | - 函数返回类型会告知 Hilt 函数提供哪个类型的实例。


Gradle Build Setup

Hilt 是 Android官方在依赖注入库Dagger的基础上二次封装的产物。