Hilt 是推荐用于在 Android 中实现依赖项注入的 Jetpack 库。Hilt 定义了一种在应用中实现 DI 的标准方法,它会为项目中的每个 Android 类提供容器并自动为您管理其生命周期。
Hilt 在热门 DI 库 Dagger 的基础上构建而成,因而能够受益于 Dagger 提供的编译时正确性、运行时性能、可伸缩性和 Android Studio 支持。
Hilt 允许非Android接受注入,也允许外部库作依赖项。
Hilt作用于两种类:依赖项(应用类:提供应用application级组件)和接受注入的类
@HiltAndroidApp class ExampleApplication: Application() {}
Application对应的组件是所有应用的父组件,Hilt生成的组件会附加到Application
的生命周期@AndroidEntryPoint
Hilt支持的Android 类,@AndroidEntryPoint
会为项目中的每个 Android 类生成一个单独的 Hilt 组件。这些组件可以从它们各自的父类接收依赖项,如组件层次结构中所述。
Application |
@HiltAndroidApp |
|
---|---|---|
ViewModel |
@HiltViewModel |
|
Activity |
AppCompatActivity |
仅扩展 ComponentActivity 的 activity |
Frament |
扩展 androidx.Fragment 的 Fragment,不支持保留的 fragment。 |
|
View |
||
Service |
||
BroadcatReceiver |
定义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 |
Application 、Activity |
FragmentComponent |
Application 、Activity 和 Fragment |
ViewComponent |
Application 、Activity 和 View |
ViewWithFragmentComponent |
Application 、Activity 、Fragment 、View |
ServiceComponent |
Application 、Service |
上下文绑定:@ApplicationContext
获得应用上下文绑定;@ActivityContext
获得 activity 上下文绑定
Hilt绑定的更一般方法是Hilt模块(不通过构造函数注入的情况:接口,来自外部库的类)
注意:不同层级、@provide和@bind都要放在不同的模块中(使用不同的/package/di
下的*kt
文件)
| 在 Hilt 模块内创建一个函数,并使用 @Provides
为该函数添加注解。 | - 函数返回类型会告知 Hilt 函数提供哪个类型的实例。
函数参数会告知 Hilt 相应类型的依赖项。
函数主体会告知 Hilt 如何提供相应类型的实例。每当需要提供该类型的实例时,Hilt 都会执行函数主体。 | 如果某个类不归您所有(因为它来自外部库,如 Retrofit、OkHttpClient
或 Room 数据库等类),或者必须使用构建器模式创建实例,也无法通过构造函数注入。 | @Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule {
@Provides
fun provideAnalyticsService(
// Potential dependencies of this type
): AnalyticsService {
return Retrofit.Builder()
.baseUrl("https://example.com")
.build()
.create(AnalyticsService::class.java)
}
} |
| --- | --- | --- | --- |
| 使用 @Binds
注入接口实例 | - 函数返回类型会告知 Hilt 该函数提供哪个接口的实例。
函数参数会告知 Hilt 要提供哪种实现。 | | @Module @InstallIn(ActivityComponent::class) abstract class AnalyticsModule {
@Binds abstract fun bindAnalyticsService( analyticsServiceImpl: AnalyticsServiceImpl ): AnalyticsService } | | | | | |
Hilt 是 Android官方在依赖注入库Dagger的基础上二次封装的产物。