You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dagger2多模块项目未生成xxxModule_xxxFactory类问题求助

解决多模块Dagger2中RoomModule相关Factory类缺失的问题

首先来解答你第一个疑问:那些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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:36:50