Hilt依赖注入与Fragment模块集成 - 第1节

1.1 原理与背景:为什么需要Hilt

在Fragment中使用依赖注入(DI)可以解决手动创建依赖导致的耦合问题。Hilt是Google基于Dagger构建的Android DI框架,它通过编译时生成代码,为Fragment提供自动注入能力。Hilt的核心原理是:

  • 编译时处理:通过@HiltAndroidApp、@AndroidEntryPoint等注解,在编译阶段生成注入代码,避免运行时反射性能损耗。
  • 容器化管理:每个Fragment持有自己的组件(Component),生命周期与Fragment一致,确保依赖对象在正确的范围内创建和销毁。
  • 模块化集成:与Gradle构建系统深度集成,通过插件和依赖库组合完成配置。
对比项手动注入Hilt注入
代码量需要编写大量Factory/Provider类注解驱动,自动生成
生命周期管理手动管理组件销毁自动跟随Fragment生命周期
编译时验证无编译时检查依赖图完整性
Fragment集成需在onAttach手动注入@AndroidEntryPoint自动注入
关键概念:Hilt的“组件”概念——每个Fragment对应一个FragmentComponent,其生命周期与Fragment一致,当Fragment销毁时,该组件及其注入的单例对象自动回收。

1.2 实现流程概览

Hilt环境搭建分为四个步骤,整体流程如下图所示。每个步骤完成后必须同步项目,并在编译时验证依赖关系。

Hilt环境搭建流程 项目级 build.gradle 模块级 build.gradle 应用 Hilt 插件 Sync Now 同步 Gradle Build 验证 建议顺序执行,不可跳过同步步骤直接编译 ① ② ③

1.3 详细实现步骤

1.3.1 添加Hilt Gradle插件(项目级)

在项目根目录的build.gradle(Groovy或Kotlin DSL)中加入Hilt的Classpath依赖:

// 项目级 build.gradle (Project-level)
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        // 其他classpath...
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.48'
    }
}
版本一致性:hilt-android-gradle-plugin版本必须与hilt-android库版本一致,否则编译期可能出现Hilt版本冲突错误。

1.3.2 添加Hilt库依赖(模块级)

在app/build.gradle(模块级)中引入Hilt库和Fragment专用扩展:

// 模块级 build.gradle (Module: app)
plugins {
    id 'com.android.application'
    id 'kotlin-kapt'  // 必须启用kapt
    id 'com.google.dagger.hilt.android'  // 应用Hilt插件
}

android {
    // 其他配置...
}

dependencies {
    implementation 'com.google.dagger:hilt-android:2.48'
    kapt 'com.google.dagger:hilt-compiler:2.48'
    // Fragment注入扩展(可选但推荐)
    implementation 'androidx.hilt:hilt-navigation-fragment:1.1.0'
}

kapt {
    correctErrorTypes true
}
关键依赖说明:hilt-compiler是编译时处理器,必须使用kapt声明;hilt-navigation-fragment用于Fragment间导航时的依赖共享。

1.3.3 同步项目并验证编译

修改Gradle文件后,执行以下操作验证环境:

  1. Synk Now:点击Android Studio顶部提示栏的Sync Now按钮,或通过File → Sync Project with Gradle Files触发同步。
  2. 编译验证:运行./gradlew assembleDebug或点击Build → Make Project,观察控制台输出。
// 控制台成功示例(编译通过)
> Task :app:kaptGenerateStubsDebugKotlin UP-TO-DATE
> Task :app:kaptDebugKotlin UP-TO-DATE
> Task :app:compileDebugKotlin UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:assembleDebug UP-TO-DATE

BUILD SUCCESSFUL in 3s

1.4 常见错误与调试

错误信息原因解决方案
Could not find com.google.dagger:hilt-android-gradle-plugin仓库未配置或版本号错误在项目级build.gradle中添加google()和mavenCentral()仓库
Unresolved reference: kapt未启用Kotlin kapt插件在模块级插件列表中添加id 'kotlin-kapt'
Flag is not supported by this version of HiltHilt版本与Gradle版本不兼容将Hilt升级至2.48+(支持Gradle 8.x)
Dagger does not support injecting into FragmentFragment未添加@AndroidEntryPoint注解在Fragment类上添加@AndroidEntryPoint(下章详细说明)
调试技巧:如果assembleDebug卡住或报OutOfMemoryError,在gradle.properties中增加org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m。

1.5 性能与稳定性优化建议

  • 使用增量编译:在gradle.properties中启用kapt.incremental.apt=true,减少Hilt注解处理时间。
  • 避免模块级依赖冲突:如果项目有多个模块,确保所有模块使用同一版本的Hilt,通过hilt-bom统一管理:
    // 模块级 build.gradle
        implementation platform('com.google.dagger:hilt-bom:2.48')
        implementation 'com.google.dagger:hilt-android'
        kapt 'com.google.dagger:hilt-compiler'
  • 组件回收优化:Hilt会自动为每个Fragment创建组件,但频繁创建/销毁可能带来GC压力。对于高频弹出的DialogFragment,建议使用@FragmentScoped作用域复用组件。