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

Android中Dagger 2.11多模块依赖注入异常求助

解决Dagger注入中ModuleTwo的Delegator无法找到的问题

我来帮你捋捋这个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:01:49