Hilt集成Proto DataStore报错:InjectProcessingStep无法处理CacheRepositoryImpl
解决Proto DataStore与Hilt集成时的Settings类解析问题
问题根源
Proto DataStore的Settings类属于编译时生成的代码,Hilt的注解处理器执行顺序可能早于Proto类的生成,导致处理器找不到该类,进而引发注入失败。
具体解决方案
校验Proto文件配置
- 确保
.proto文件放在src/main/proto目录下(默认Proto文件存放路径) - 在Module级别的
build.gradle中配置正确的Proto生成规则,必须启用Lite版本:android { sourceSets { main { proto { srcDir "src/main/proto" } } } protobuf { protoc { artifact = "com.google.protobuf:protoc:3.24.4" } generateProtoTasks { all().each { task -> task.builtins { java { option "lite" } } } } } }
- 确保
调整注解处理器执行顺序
强制让Protobuf处理器先于Hilt处理器执行,避免Hilt找不到生成的Settings类:dependencies { implementation "androidx.datastore:datastore-core:1.0.0" implementation "androidx.datastore:datastore-proto:1.0.0" implementation "com.google.protobuf:protobuf-javalite:3.24.4" kapt "com.google.dagger:hilt-compiler:2.48" } kapt { correctErrorTypes = true processors = ["com.google.protobuf.javap.JavaLiteProtoProcessor", "dagger.hilt.android.processor.internal.androidentrypoint.InjectProcessingStep"] }清理并重建项目
- 执行命令清理缓存:
./gradlew clean - 重新构建项目:
./gradlew assembleDebug,确保Settings类被正确生成并被Hilt识别
- 执行命令清理缓存:
检查DataStore注入代码
确认DataStore<Settings>的提供者配置正确,示例代码如下:@Module @InstallIn(SingletonComponent::class) object DataStoreModule { @Provides fun provideSettingsDataStore(@ApplicationContext context: Context): DataStore<Settings> { return context.createDataStore( fileName = "settings.pb", serializer = SettingsSerializer ) } } object SettingsSerializer : Serializer<Settings> { override val defaultValue: Settings = Settings.getDefaultInstance() override suspend fun readFrom(input: InputStream): Settings { try { return Settings.parseFrom(input) } catch (e: InvalidProtocolBufferException) { throw CorruptionException("Cannot read proto.", e) } } override suspend fun writeTo(t: Settings, output: OutputStream) { t.writeTo(output) } }清除IDE缓存
若上述操作后仍报错,执行IDE的Invalidate Caches / Restart操作,确保生成的Settings类被正确索引
内容的提问来源于stack exchange,提问作者Oluwatosin Solarin
相关产品推荐
相关产品推荐

