多模块应用中Dagger Hilt依赖注入报错问题求助
Hilt跨模块注入失败的问题根源与解决配置
核心问题
你遇到的error.NonExistentClass错误,本质是Hilt的KSP注解处理器在feature模块编译时,无法访问database模块中repository相关的注解元数据或类定义,导致无法识别ViewModel的依赖项,进而生成错误的组件代码。
必查的遗漏配置点
1. database模块的依赖暴露方式错误
如果database模块中用implementation声明Repository接口、Hilt模块等需要跨模块访问的代码,feature模块的注解处理器无法获取到这些类的信息。必须:
- 在database模块的
build.gradle中,将需要暴露给其他模块的依赖(如Room、Repository接口)用api关键字声明,而非implementation; - 确保Repository接口、实现类、Hilt提供方法的访问修饰符为
public(Kotlin默认是internal,会限制跨模块访问)。
2. Hilt模块的安装作用域缺失
database模块中提供Repository实例的Hilt模块,必须用@InstallIn指定全局可见的组件作用域,否则feature模块的Hilt处理器无法识别该依赖提供方。示例:
@Module @InstallIn(SingletonComponent::class) // 绑定到全局单例组件 object DatabaseModule { @Provides fun provideMyRepository(db: MyRoomDatabase): MyRepository { return MyRepositoryImpl(db) } }
3. 多模块的Hilt注解处理器配置不完整
两个模块都必须配置Hilt的KSP依赖,且版本一致:
- database模块的
build.gradle配置:
plugins { id("com.android.library") id("kotlin-android") id("com.google.dagger.hilt.android") id("com.google.devtools.ksp") } dependencies { implementation("com.google.dagger:hilt-android:2.48") ksp("com.google.dagger:hilt-android-compiler:2.48") // 用api暴露Room给其他模块 api("androidx.room:room-runtime:2.6.1") ksp("androidx.room:room-compiler:2.6.1") }
- feature模块的
build.gradle配置:
plugins { id("com.android.application") // 或library id("kotlin-android") id("com.google.dagger.hilt.android") id("com.google.devtools.ksp") } dependencies { implementation(project(":database")) implementation("com.google.dagger:hilt-android:2.48") ksp("com.google.dagger:hilt-android-compiler:2.48") }
4. 编译缓存干扰
执行./gradlew clean清理项目缓存后重新编译,旧缓存可能导致类识别异常。
验证要点
确认ViewModel的构造函数注入正确,依赖的Repository类在database模块中是public且有Hilt提供方:
@HiltViewModel class HomeViewModel @Inject constructor( private val myRepository: MyRepository ) : ViewModel() { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者Victor kiptoo
相关产品推荐
相关产品推荐

