如何在Android Studio的Kotlin项目中添加Hilt依赖注入框架?
解决Hilt依赖注入代码无法运行的问题
问题背景
我是Kotlin新手,跟着2023年的Hilt依赖注入教程学习,但教程里的代码跑不起来,网上也找不到清晰的修改指引。我的Kotlin版本为232-1.9.0-release-358-AS10227.8.2321.11479570,当前两个build.gradle文件内容如下:
原Module: app的build.gradle
plugins { alias(libs.plugins.androidApplication) alias(libs.plugins.jetbrainsKotlinAndroid) } android { namespace = "com.package.myApp" compileSdk = 34 defaultConfig { applicationId = "com.package.myApp" minSdk = 30 targetSdk = 34 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true } } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.1" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.ui) implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) implementation(libs.androidx.lifecycle.viewmodel.compose) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) }
原Project级build.gradle
plugins { alias(libs.plugins.androidApplication) apply false alias(libs.plugins.jetbrainsKotlinAndroid) apply false }
修改步骤
1. 修改Project级build.gradle
添加Hilt的classpath插件,适配Kotlin 1.9.0版本:
plugins { alias(libs.plugins.androidApplication) apply false alias(libs.plugins.jetbrainsKotlinAndroid) apply false // 添加Hilt插件 id("com.google.dagger.hilt.android") version "2.48" apply false }
2. 修改Module: app的build.gradle
第一步:添加Hilt插件到plugins块
plugins { alias(libs.plugins.androidApplication) alias(libs.plugins.jetbrainsKotlinAndroid) // 添加Hilt插件 id("com.google.dagger.hilt.android") }
第二步:更新测试运行器
将defaultConfig里的testInstrumentationRunner替换为Hilt专用测试运行器:
testInstrumentationRunner = "com.package.myApp.HiltTestRunner"
需手动创建
HiltTestRunner类,代码如下:package com.package.myApp import android.app.Application import android.content.Context import androidx.test.runner.AndroidJUnitRunner import dagger.hilt.android.testing.HiltTestApplication class HiltTestRunner : AndroidJUnitRunner() { override fun newApplication( cl: ClassLoader?, className: String?, context: Context? ): Application { return super.newApplication(cl, HiltTestApplication::class.java.name, context) } }
第三步:添加Hilt相关依赖
在dependencies块中加入Hilt核心库、Compose整合库及测试依赖:
dependencies { // 原有依赖保留... // Hilt核心依赖 implementation("com.google.dagger:hilt-android:2.48") kapt("com.google.dagger:hilt-android-compiler:2.48") // Hilt与Compose整合 implementation("androidx.hilt:hilt-navigation-compose:1.1.0") // Hilt测试依赖 androidTestImplementation("com.google.dagger:hilt-android-testing:2.48") kaptAndroidTest("com.google.dagger:hilt-android-compiler:2.48") }
第四步:启用kapt编译工具
在android块中添加kapt配置:
android { // 原有配置保留... kapt { correctErrorTypes = true } }
修改后的完整Module: app的build.gradle
plugins { alias(libs.plugins.androidApplication) alias(libs.plugins.jetbrainsKotlinAndroid) id("com.google.dagger.hilt.android") } android { namespace = "com.package.myApp" compileSdk = 34 defaultConfig { applicationId = "com.package.myApp" minSdk = 30 targetSdk = 34 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "com.package.myApp.HiltTestRunner" vectorDrawables { useSupportLibrary = true } } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.1" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } // 启用kapt kapt { correctErrorTypes = true } } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.ui) implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) implementation(libs.androidx.lifecycle.viewmodel.compose) // Hilt依赖 implementation("com.google.dagger:hilt-android:2.48") kapt("com.google.dagger:hilt-android-compiler:2.48") implementation("androidx.hilt:hilt-navigation-compose:1.1.0") testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.ui.test.junit4) // Hilt测试依赖 androidTestImplementation("com.google.dagger:hilt-android-testing:2.48") kaptAndroidTest("com.google.dagger:hilt-android-compiler:2.48") debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) }
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

