使用Hilt+Proto DataStore时Gradle找不到生成类UserPreferences求助
解决Hilt与Proto DataStore构建时的NonExistentClass错误
问题根源
你遇到的问题确实是Hilt的注解处理任务早于Protobuf代码生成任务执行导致的。Hilt在解析@Provides方法的返回类型DataStore<UserPreferences>时,Protobuf还没生成UserPreferences类,所以Gradle报NonExistentClass错误。移除@Provides后,Hilt不需要在注解处理阶段校验这个类型,后续Protobuf生成类后编译就能正常完成。
解决方案:调整Gradle任务依赖顺序
通过让Hilt的注解处理任务依赖Protobuf的代码生成任务,强制Protobuf先完成代码生成,再执行Hilt的注解处理。
针对Kapt(Hilt默认使用kapt)的配置
在你的App模块的build.gradle.kts(或build.gradle)中添加以下配置:
Kotlin DSL(build.gradle.kts)
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubs> { dependsOn(tasks.withType<com.google.protobuf.gradle.ProtobufCompile>()) } tasks.withType<org.jetbrains.kotlin.gradle.tasks.Kapt> { dependsOn(tasks.withType<com.google.protobuf.gradle.ProtobufCompile>()) }
Groovy DSL(build.gradle)
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubs) { dependsOn tasks.withType(com.google.protobuf.gradle.ProtobufCompile) } tasks.withType(org.jetbrains.kotlin.gradle.tasks.Kapt) { dependsOn tasks.withType(com.google.protobuf.gradle.ProtobufCompile) }
额外检查:确保Protobuf生成代码被识别
如果上述配置后仍有问题,确认Protobuf生成的Kotlin代码路径被Gradle的源码集包含。Protobuf插件默认会自动处理,但可以手动添加兜底配置:
Kotlin DSL
sourceSets { main { kotlin.srcDirs("build/generated/source/proto/main/kotlin") } }
Groovy DSL
sourceSets { main { kotlin.srcDirs 'build/generated/source/proto/main/kotlin' } }
验证
添加配置后,重新执行./gradlew clean build,Hilt会等待Protobuf生成UserPreferences类后再进行注解处理,错误即可解决。
内容的提问来源于stack exchange,提问作者Dmitry Kutyrev
相关产品推荐
相关产品推荐

