Dagger2多模块项目未生成xxxModule_xxxFactory类问题求助
首先来解答你第一个疑问:那些xxFactory类是什么?
Dagger2在编译时会为每个带有@Provides注解的方法自动生成对应的Factory类,比如你的RoomModule里的provideModelDao()方法,Dagger会生成RoomModule_ProvideModelDaoFactory。这些工厂类的作用是封装依赖实例的创建逻辑,是Dagger构建依赖注入链的核心组成部分——Component会通过这些Factory类来获取对应依赖的实例。
接下来分析你遇到的问题,以及怎么让Dagger生成这些Factory类:
可能的原因及解决步骤
1. 多模块下的注解处理器配置遗漏
这是多模块项目里最常见的问题:如果你的RoomModule所在的模块没有配置Dagger的注解处理器,Dagger根本不会生成对应的Factory类。
- 如果你用的是Kotlin项目,确保该模块的
build.gradle里配置了kotlin-kapt插件和Dagger的注解处理器依赖:plugins { id("com.android.library") // 或者com.android.application,根据模块类型 id("kotlin-android") id("kotlin-kapt") // 必须添加这个插件 } dependencies { // Dagger核心库 implementation("com.google.dagger:dagger:2.48") // 注解处理器,kapt对应Kotlin项目 kapt("com.google.dagger:dagger-compiler:2.48") // Room相关依赖根据你的版本添加 implementation("androidx.room:room-runtime:2.6.1") kapt("androidx.room:room-compiler:2.6.1") } - 如果你是Java项目,把
kapt换成annotationProcessor即可。
2. RoomModule未被正确关联到Component
Dagger的Component需要明确声明它要使用哪些Module,否则Component无法找到Module里的依赖提供方法,自然也不会触发Factory类的生成。
确保你的Application Component(或者负责注入Activity的Component)包含了RoomModule:
@Singleton @Component(modules = [RoomModule::class, /*其他需要的Module*/]) interface MyApplicationComponent : AndroidInjector<MyApplication> { // 组件的其他声明 }
另外,如果RoomModule在单独的子模块里,你的App模块(也就是Component所在的模块)必须在build.gradle中依赖这个子模块:
dependencies { implementation(project(":your-room-module-name")) }
3. 作用域不匹配
你的RoomModule里的@Provides方法用了@Singleton注解,那么对应的Component必须也标注@Singleton作用域。如果Component的作用域和Module的不匹配,Dagger会拒绝生成对应的Factory类,甚至直接报错。
检查你的Component类顶部的注解,确保它和Module的作用域一致:
@Singleton // 必须和RoomModule里的@Singleton对应 @Component(modules = [RoomModule::class]) interface MyApplicationComponent { // ... }
4. 编译缓存导致的问题
有时候Android Studio的编译缓存会“卡住”,导致Dagger没有重新生成最新的Factory类。这种情况下,你可以:
- 执行
Build -> Clean Project清理旧的编译产物 - 再执行
Build -> Rebuild Project重新构建整个项目
5. Activity注入的配置问题
虽然你移除Activity的@Inject后Component能构建,但还要确保你的Activity被正确纳入Dagger的Android注入体系:
- 你的Application类应该继承
DaggerApplication,或者实现HasAndroidInjector并提供对应的DispatchingAndroidInjector - 确认
AndroidInjection.inject(this)在onCreate方法里的调用时机正确(在super.onCreate之后是对的)
总结
你之前单模块没问题,现在多模块出问题,大概率是遗漏了子模块的注解处理器配置或者Component对RoomModule的关联。按照上面的步骤逐一排查,应该就能解决Factory类缺失的问题。
内容的提问来源于stack exchange,提问作者Alfredo Bejarano

