Hilt:依赖注入框架 · AndroidX 源码指南
AAndroidX 源码指南
Hilt
依赖注入 · androidx.hilt

Hilt:依赖注入框架1.4.0-rc01

在 Android 应用里用 Hilt 管理依赖:模块、绑定、作用域与生命周期。

最后更新 2026-08-01

主要职责当前源码版本
Hilt编译期依赖注入框架1.4.0-rc01
Hilt Navigation ComposeCompose 中获取 Hilt ViewModel1.4.0-rc01
Hilt WorkWorkManager 中的 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整个应用
@ActivityRetainedScopedActivity 留存期(跨配置变更)
@ViewModelScoped单个 ViewModel
@ActivityScopedActivity 生命周期

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
  • 作用域决定实例存活;装配失败在编译期暴露。
  • 构造函数注入优先于字段/静态访问。

相关页面