如何正确实现Hilt?
我实现了Hilt,结果出现了这个错误:[ksp] [Hilt] 期望 @AndroidEntryPoint有一个值。是不是忘记应用Gradle插件?(com.google.dagger.hilt.android) 。
在插件中尝试实现它时,我得到这个错误:插件ID 'com.google.dagger.hilt.android' 已在第2 行被请求过。
这是怎么回事?我该如何解决?
build.gradle.kts (Project)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.kotlin.compose) apply false
alias(libs.plugins.kotlin.android) apply false
// Room
alias(libs.plugins.ksp) apply false
// Hilt
alias(libs.plugins.hilt) apply false
}
build.gradle.kts (app)
import com.android.aaptcompiler.compileResource
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.compose)
// alias(libs.plugins.kotlin.android) ???
alias(libs.plugins.ksp)
//alias(libs.plugins.hilt) ???
}
android {
namespace = "com.slatertechnologies.changebackgroundcolor"
compileSdk {
version = release(36) {
minorApiLevel = 1
}
}
defaultConfig {
applicationId = "com.slatertechnologies.changebackgroundcolor"
minSdk = 24
targetSdk = 36
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
buildFeatures {
compose = true
}
}
dependencies {
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.graphics)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
testImplementation(libs.junit)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(libs.androidx.junit)
debugImplementation(libs.androidx.compose.ui.test.manifest)
debugImplementation(libs.androidx.compose.ui.tooling)
// Room
ksp(libs.androidx.room.compiler)
implementation(libs.androidx.room.runtime)
// Hilt
ksp(libs.hilt.compiler)
implementation(libs.hilt.android)
}
libs.versions.toml
[versions]
agp = "9.2.1"
coreKtx = "1.18.0"
junit = "4.13.2"
junitVersion = "1.3.0"
espressoCore = "3.7.0"
lifecycleRuntimeKtx = "2.10.0"
activityCompose = "1.13.0"
kotlin = "2.2.10"
composeBom = "2026.02.01"
room = "2.8.4"
ksp = "2.3.4"
hilt = "2.57.2"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" }
androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }
# Room
androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room"}
androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room"}
# Hilt
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt"}
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt"}
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
# Room
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp"}
# Hilt
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt"}
解决方案
你使用的Hilt版本实在太旧了。
With AGP 9, some things need to be done differently now. Specifically the way the Hilt plugin hooks into the compilation process has changed, and the first version working with AGP 9 is 2.59.
只需在版本目录中把它更新到最新版本(撰写时的最新版本),方法是修改版本目录中的以下内容:
hilt = "2.59.2"
现在你可以在Gradle文件中再次使用 alias(libs.plugins.hilt) 了。同步Gradle之后,你的应用应该就能再次构建成功。
看着你的构建文件,我想强调AGP 9的另一个变化:Kotlin现在是内置的。你不再需要在Gradle文件中指定Kotlin插件 org.jetbrains.kotlin.android。更准确地说,它现在不兼容,且不能再使用。你已经在应用模块的Gradle文件中把它注释掉了,但你还应该从项目级Gradle文件中移除 alias(libs.plugins.kotlin.android) apply false,并从版本目录中移除相应的条目。删除这一行:
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
Kotlin版本本身(kotlin = "2.2.10")仍然是Compose插件所需要的。这也覆盖了AGP 9本来会回退到的版本。默认情况下也就是2.2.10。不过你始终可以使用更新的版本。撰写时最新的是:
kotlin = "2.3.21"