Android中Dagger 2.11多模块依赖注入异常求助
我来帮你捋捋这个Dagger注入的问题,你遇到的找不到ModuleTwo里delegator注入器的情况,大概率是组件配置或者模块暴露的问题,咱们一步步来排查和解决:
先明确你的场景
- 项目拆成了两个领域包模块:ModuleOne(提供
storage可注入依赖)、ModuleTwo(提供delegator可注入依赖) - 有一个Firebase实例服务类,手动通过
DaggerAppComponent完成自身的依赖注入 - 注入时能找到ModuleOne的storage,但找不到ModuleTwo的delegator
可能的原因&对应的解决方案
1. DaggerAppComponent没包含ModuleTwo的声明
这是最常见的问题——你可能只在组件里加了ModuleOne,漏了ModuleTwo,导致Dagger生成的组件完全不知道有这个依赖的存在。
修复方式:
打开你的DaggerAppComponent接口,确保@Component注解的modules数组里同时包含两个模块:
// Kotlin示例 @Component(modules = [ModuleOne::class, ModuleTwo::class]) interface DaggerAppComponent { fun inject(firebaseService: FirebaseService) // 其他需要注入的方法 }
// Java示例 @Component(modules = {ModuleOne.class, ModuleTwo.class}) public interface DaggerAppComponent { void inject(FirebaseService firebaseService); }
修改后重新编译项目,让Dagger重新生成组件代码。
2. ModuleTwo的依赖未正确暴露
如果ModuleTwo里提供delegator的@Provides方法是包级私有(Java)或者被限制了可见性(比如Kotlin里用了internal),而你的Firebase服务类不在同一个包下,Dagger就无法访问这个依赖的提供逻辑。
修复方式:
把ModuleTwo中提供delegator的方法改成public可见性(Kotlin默认就是public,不用额外加):
@Module class ModuleTwo { @Provides fun provideDelegator(): Delegator { return DefaultDelegator() } }
3. 手动注入时遗漏了ModuleTwo的实例
你在构建DaggerAppComponent的时候,可能只传入了ModuleOne的实例,没传ModuleTwo的,导致组件无法获取到delegator的提供者。
修复方式:
检查Firebase服务类里的注入代码,确保构建组件时传入所有模块的实例:
class FirebaseService { @Inject lateinit var storage: Storage @Inject lateinit var delegator: Delegator init { DaggerDaggerAppComponent.builder() .moduleOne(ModuleOne()) .moduleTwo(ModuleTwo()) // 别漏了这一行 .build() .inject(this) } }
4. 项目依赖配置缺失
如果ModuleTwo是单独的子模块,你需要确保主模块(App模块)的build.gradle里添加了对ModuleTwo的依赖,否则编译时Dagger根本找不到ModuleTwo的类。
修复方式:
在主模块的build.gradle中添加依赖:
// Groovy dependencies { implementation project(':module-two') // 其他依赖... }
// Kotlin DSL dependencies { implementation(project(":module-two")) // 其他依赖... }
关于你提到的“复制该PR内容”
你说复制某个PR的内容能解决问题,大概率那个PR就是修复了上面某一个点——比如给DaggerAppComponent补上了ModuleTwo的声明,或者修正了ModuleTwo中依赖的可见性。你可以对照PR的改动,同步到自己的项目里,应该就能解决注入失败的问题。
内容的提问来源于stack exchange,提问作者Jono

