第2章:Hilt入门:Hilt简介、Hilt与传统Dagger的区别、Hilt项目配置与Gradle依赖
好,咱们正式开始聊Hilt。
说实话,我第一次接触Hilt的时候,心里是有点抵触的。你想啊,Dagger2刚玩明白,又来一个新框架?但真正用下来,我只想说一句——早该这么设计了。
2.1 Hilt是什么?
Hilt是Google官方推出的Android依赖注入框架。它基于Dagger,但做了大量简化。
说白了,Hilt就是Dagger的“亲儿子”。Google把Dagger那些繁琐的配置,全都封装好了。你只需要加几个注解,就能完成依赖注入。
我个人习惯把Hilt理解为:Dagger的“开箱即用”版本。
核心特点:
- 官方出品,与Android Jetpack深度集成
- 编译时生成代码,运行时零反射
- 自动管理组件生命周期
- 支持ViewModel、Fragment、Service等常见组件
2.2 Hilt与传统Dagger的区别
这个问题,我面试时经常问别人。其实区别很明显,我列个表你就懂了。
| 对比维度 | 传统Dagger | Hilt |
|---|---|---|
| 组件创建 | 手动创建Component | 自动生成,@HiltAndroidApp搞定 |
| 作用域管理 | 自己管理生命周期 | 自动绑定Android生命周期 |
| 模块配置 | 需要写大量Module | 内置常用Module,减少样板代码 |
| 学习曲线 | 陡峭,概念多 | 平缓,上手快 |
| 测试支持 | 需要额外配置 | 内置测试支持 |
我在项目中遇到过这样一个场景:用Dagger2时,每次新增一个Activity,都要去Component里加方法。项目大了以后,Component文件变得又臭又长。换成Hilt后,一个@AndroidEntryPoint注解就搞定了。嗯,这才是Android该有的样子。
2.3 Hilt项目配置与Gradle依赖
配置Hilt其实很简单。但有几个坑,我当年踩过,得跟你说说。
2.3.1 添加Gradle插件
首先,在项目根目录的build.gradle(或build.gradle.kts)中添加Hilt插件:
// 项目级 build.gradle
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
// 注意版本号要与AGP兼容
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.48'
}
}
如果你用的是Kotlin DSL,写法稍微不同:
// 项目级 build.gradle.kts
plugins {
id("com.google.dagger.hilt.android") version "2.48" apply false
}
我曾经踩过的坑:版本号一定要和你的AGP(Android Gradle Plugin)版本匹配。否则编译时会报一堆莫名其妙的错误。建议去官方版本列表查看兼容性。
2.3.2 应用插件并添加依赖
接下来,在app/build.gradle中应用插件并添加依赖:
// app/build.gradle
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'com.google.dagger.hilt.android'
id 'kotlin-kapt' // 注意:Hilt需要kapt
}
android {
// ... 你的Android配置
}
dependencies {
// Hilt核心库
implementation 'com.google.dagger:hilt-android:2.48'
kapt 'com.google.dagger:hilt-compiler:2.48'
// 如果要用ViewModel注入,还需要加这个
implementation 'androidx.hilt:hilt-navigation-fragment:1.1.0'
// 可选:WorkManager集成
implementation 'androidx.hilt:hilt-work:1.1.0'
kapt 'androidx.hilt:hilt-compiler:1.1.0'
}
// 允许kapt处理Hilt注解
kapt {
correctErrorTypes true
}
为什么需要kapt?因为Hilt在编译时生成代码,需要注解处理器。你想想看,如果运行时才去解析注解,那性能得多差?
2.3.3 初始化Application
最后一步,给你的Application类加上@HiltAndroidApp注解:
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
// 你的初始化代码
}
}
这个注解会触发Hilt生成一个父Component,它是整个依赖图的根。所有其他组件都从它这里派生。
小提示:别忘了在AndroidManifest.xml中注册这个Application类。我见过有人漏掉这一步,结果运行时直接崩溃。
2.4 Hilt的核心组件结构
为了让你更直观地理解Hilt的组件层次,我画了一张图:
这张图展示了Hilt的组件层次。从顶层的ApplicationComponent开始,向下延伸到Activity、Fragment等。每个组件都有自己的生命周期,Hilt会自动管理它们的创建和销毁。
你可能会问:为什么需要这么多组件?其实原因很简单——不同的对象有不同的生命周期。比如网络客户端应该是单例,但某个Activity的临时状态就不应该全局共享。
2.5 验证配置是否成功
配置完成后,怎么知道Hilt有没有正常工作?我教你一个简单的方法。
创建一个简单的类,加上@Inject注解:
class MyRepository @Inject constructor() {
fun getData(): String = "Hello from Hilt!"
}
然后在Activity里注入它:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var repository: MyRepository
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 如果能正常调用,说明Hilt配置成功
println(repository.getData())
}
}
如果编译通过,运行后控制台输出了"Hello from Hilt!",恭喜你,配置成功了。
注意:如果编译时报错Dagger does not support injection into ...,八成是你忘了加@AndroidEntryPoint注解。我当年因为这个bug排查了整整两个小时。
2.6 小结
这一章我们聊了Hilt是什么、它和传统Dagger的区别,以及如何配置。说白了,Hilt就是Google帮你把Dagger的脏活累活都干了。你只需要关注业务逻辑,剩下的交给注解。
下一章,我们会深入Hilt的注解体系,看看@Module、@Provides、@Binds这些注解到底怎么用。嗯,到时候我会分享一些实战中的小技巧。
公众号:蓝海资料掘金营,微信deep3321