Hilt
依赖注入 · androidx.hilt
Hilt:依赖注入框架1.4.0-rc01
在 Android 应用里用 Hilt 管理依赖:模块、绑定、作用域与生命周期。
最后更新 2026-08-01
| 库 | 主要职责 | 当前源码版本 |
|---|---|---|
| Hilt | 编译期依赖注入框架 | 1.4.0-rc01 |
| Hilt Navigation Compose | Compose 中获取 Hilt ViewModel | 1.4.0-rc01 |
| Hilt Work | WorkManager 中的 Hilt 集成 | 1.4.0-rc01 |
三件套入门
// 1. Application 入口(必须)
@HiltAndroidApp
class App : Application()
// 2. 页面入口(Activity/Fragment/View)
@AndroidEntryPoint
class MainActivity : ComponentActivity()
// 3. ViewModel
@HiltViewModel
class MainViewModel @Inject constructor(
private val api: Api,
) : ViewModel()提供依赖的两种方式
方式 1:构造注入(自己的类)
class UserRepository @Inject constructor(
private val api: Api,
private val dao: UserDao,
)方式 2:Module + Provides(外部类型)
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient = ...
@Provides
@Singleton
fun provideRetrofit(client: OkHttpClient): Retrofit = ...
}作用域对照
| 注解 | 存活范围 |
|---|---|
@Singleton | 整个应用 |
@ActivityRetainedScoped | Activity 留存期(跨配置变更) |
@ViewModelScoped | 单个 ViewModel |
@ActivityScoped | Activity 生命周期 |
Meme 项目的 NetworkModule 就是这种模式:@Singleton + @Provides 提供 Retrofit/OkHttp/Interceptor。
依赖注入的原则
// ✅ 构造函数注入:可测试、可见依赖
class Uploader @Inject constructor(
private val api: Api,
)
// ❌ 字段/静态访问:隐藏依赖,难测试
class Uploader {
private val api = ApiFactory.api // 反模式
}常见陷阱
- 忘
@HiltAndroidApp:Application 没标记,运行时崩溃。 @AndroidEntryPoint的类:它内部的 ViewModel 才能用@HiltViewModel;普通类用@Inject constructor+@EntryPoint。- 装配在编译期:依赖缺失/循环 → 构建失败,不是运行时崩溃(这是优点)。
- 接口绑定:接口 → 实现用
@Binds:
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindUserRepo(impl: UserRepositoryImpl): UserRepository
}复制即用
// build.gradle.kts
// implementation("com.google.dagger:hilt-android:2.59.2")
// ksp("com.google.dagger:hilt-android-compiler:2.59.2")
@HiltAndroidApp
class App : Application()
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com")
.build()
}
@AndroidEntryPoint
class MainActivity : ComponentActivity()
@HiltViewModel
class MainViewModel @Inject constructor(
private val api: ApiService,
) : ViewModel()要点
- 三件套:
@HiltAndroidApp→@AndroidEntryPoint→@HiltViewModel。 - 自己的类用
@Inject constructor;外部类型用@Module + @Provides;接口用@Binds。 - 作用域决定实例存活;装配失败在编译期暴露。
- 构造函数注入优先于字段/静态访问。