第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 组件层次结构 @HiltAndroidApp ApplicationComponent (单例) @AndroidEntryPoint ActivityComponent @AndroidEntryPoint FragmentComponent @HiltViewModel ViewModelComponent @AndroidEntryPoint ServiceComponent 自定义对象注入 网络/数据库依赖

这张图展示了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