🧩 Hilt 核心概念

📘 实战 · Compose 整合 🎒 中小学生色系

📌 1. Hilt 简介 Hilt = 标准化 DI 框架

⚡ Hilt 是 Google 官方基于 Dagger 打造的 Android 依赖注入库,专为 Android 开发简化 Dagger 的配置复杂度。它通过注解和编译期代码生成,自动管理对象依赖,让开发者告别手动创建工厂类。

在 Jetpack Compose 中,Hilt 提供 hiltViewModel() 等原生扩展,一行代码即可注入 ViewModel,完美契合声明式 UI。

🏷️ 注解驱动 🏷️ 编译期验证 🏷️ 生命周期感知

🔗 2. Hilt 与 Dagger 的关系 Dagger 核心 · Hilt 脚手架

🧬 Dagger 2

  • 纯编译期 DI 框架,无运行时反射
  • 需要手动创建 Component、Module、Subcomponent
  • 学习曲线陡峭,模板代码较多
  • 完全通用 (Java/Kotlin/Android)

🧩 Hilt

  • 基于 Dagger 2 的 Android 官方封装
  • 自动生成 ApplicationComponent 等标准组件
  • 提供 @HiltAndroidApp、@AndroidEntryPoint 等注解
  • 与 Jetpack 深度整合 (ViewModel, WorkManager…)

💡 一句话: Hilt = Dagger 2 + Android 最佳实践 + 零模板配置。

🌟 3. 优势 & 适用场景

优势说明适用场景
🚀 快速集成仅需 @HiltAndroidApp + @AndroidEntryPoint 即可启用新项目 / 老项目重构
🧪 编译期安全依赖图在编译时校验,避免运行时崩溃大型团队协作
📦 自动管理生命周期Component 随 Activity/Fragment 自动创建&销毁Android 四大组件
🧩 Compose 原生支持hiltViewModel() 直接注入 ViewModelCompose 项目
🔌 模块化友好支持多模块、延迟加载、限定符中大型项目

✅ 典型适用场景

  • MVVM + Compose 架构
  • Repository 模式数据注入
  • 网络/数据库/本地存储管理
  • 多模块 feature 解耦

⚠️ 注意

  • 不适合超小项目 (但也不冲突)
  • 编译时间略增 (但远小于手写 Dagger)

🧭 Hilt + Compose 架构图 依赖注入流向

@HiltAndroidApp ApplicationComponent @AndroidEntryPoint ActivityComponent Compose UI hiltViewModel() ViewModel + DI @Module / @Provides / @Binds 网络 · 数据库 · 仓库 · 工具类 🔄 编译期生成依赖图,运行时自动注入

⬆️ Hilt 自动桥接 Application → Activity → Compose ViewModel

📄 实战代码片段 Compose + Hilt ViewModel 注入

// 1. Application 入口
@HiltAndroidApp
class MyApplication : Application()

// 2. Activity 入口
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val viewModel: MyViewModel = hiltViewModel()
            MyScreen(viewModel)
        }
    }
}

// 3. ViewModel 自动注入 Repository
@HiltViewModel
class MyViewModel @Inject constructor(
    private val repo: MyRepository
) : ViewModel() { ... }

// 4. Repository 提供依赖
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides @Singleton
    fun provideApi(): MyApi = Retrofit.Builder()...
}

🔍 使用 hiltViewModel() 无需手动传入 Factory,Hilt 自动处理依赖链。