Hilt 是 Google 基于 Dagger 封装的 Android 专属依赖注入(DI)框架,显著简化了依赖管理流程,提升代码可维护性和可测试性。以下是核心要点及使用指南:
dagger2:
Hilt vs Dagger2:Android 依赖注入框架对比-CSDN博客
一、核心概念与优势
简化 Dagger 配置
自动生成组件和作用域,减少模板代码(如手动创建 Dagger 组件)27。
内置 Android 类支持(如
Application
、Activity
),通过注解即可注入依赖38。
生命周期管理
为不同 Android 类预定义组件和作用域(如
SingletonComponent
对应应用全局,ActivityComponent
绑定 Activity 生命周期),自动释放资源。
与 Jetpack 深度集成
支持 ViewModel、Room、WorkManager 等 Jetpack 组件,通过
@HiltViewModel
等注解无缝注入。
二、基础使用步骤
添加依赖
在项目级build.gradle
中引入插件:
buildscript {
dependencies {
classpath "com.google.dagger:hilt-android-gradle-plugin:2.44"
}
}
在模块级 build.gradle
中启用:
plugins {
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}
dependencies {
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"
}
初始化 Hilt
在自定义 Application
类添加注解:
@HiltAndroidApp
class MyApp : Application()
声明依赖提供方式
构造函数注入(推荐):
class UserRepository @Inject constructor() { ... }
模块注入(用于接口或第三方库):
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit { ... }
}
注入依赖到 Android 类
使用 @AndroidEntryPoint
标记支持类(如 Activity/Fragment),并通过 @Inject
注入字段:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var userRepo: UserRepository
}
三、与 Jetpack 组件集成
ViewModel 注入
使用@HiltViewModel
注解,依赖通过构造函数注入:
@HiltViewModel
class MyViewModel @Inject constructor(
private val apiService: ApiService
) : ViewModel() { ... }
Activity/Fragment 中通过
by viewModels()
获取实例27。Room 数据库注入
通过模块提供 Database 和 Dao 实例:
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
@Provides
@Singleton
fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, "db").build()
}
}
:cite[2]
四、作用域与组件对照表
Hilt 通过预定义组件管理依赖生命周期,以下为常用作用域:
作用域注解 | 绑定组件 | 生命周期范围 |
---|---|---|
@Singleton |
SingletonComponent |
应用全局 |
@ActivityRetainedScoped |
ActivityRetainedComponent |
配置更改后仍存活 |
@ActivityScoped |
ActivityComponent |
Activity |
@ViewModelScoped |
ViewModelComponent |
ViewModel |
@FragmentScoped |
FragmentComponent |
Fragment |
示例:
@ActivityScoped
class AuthManager @Inject constructor() { ... } // 随 Activity 销毁释放
五、常见问题解决
注入私有字段报错
Hilt 不支持注入私有字段,需改为public
或protected
3。作用域冲突
确保模块安装的组件(@InstallIn
)与依赖的作用域匹配(如 Activity 级模块不可提供全局单例)4。多模块依赖
编译模块需传递包含所有 Hilt 模块和注入类3。
总结
Hilt 通过标准化 DI 实现,解决了 Android 开发中手动管理依赖的复杂性。其核心价值在于:
✅ 降低门槛:无需深入 Dagger 即可实现高效依赖管理。
✅ 生命周期安全:自动绑定组件作用域,避免内存泄漏。
✅ 生态兼容:深度整合 Jetpack,适合现代 Android 架构。
建议从官方示例入手,逐步实践模块化注入场景。完整文档参考:Hilt 官方指南。