Dagger编译报错:Object is bound multiple times——组件C存在重复依赖
解决Dagger中'String is bound multiple times'编译错误
这个错误的核心原因是:Dagger要求同一个类型的依赖在组件的依赖注入图中必须有唯一的绑定实现。你的代码里ModuleA和ModuleB都通过@Provides提供了String类型的依赖,Dagger无法确定该选用哪一个,因此触发了绑定重复的编译错误。
下面是几种可行的解决办法:
1. 使用限定符(Qualifier)区分不同的依赖实例
通过自定义限定符注解,给两个String依赖打上标记,让Dagger能区分它们。
步骤:
- 定义自定义限定符注解:
@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class StringFromModuleA @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class StringFromModuleB
- 修改两个Module的
provideString方法,添加对应的限定符:
class ModuleA{ @Provides @StringFromModuleA fun provideString() = "来自ModuleA的字符串" // 其他Provider方法 } class ModuleB{ @Provides @StringFromModuleB fun provideString() = "来自ModuleB的字符串" // 其他Provider方法 }
- 在需要注入的地方,通过限定符指定要注入的实例:
class TargetClass @Inject constructor( @StringFromModuleA val stringA: String, @StringFromModuleB val stringB: String ) { // 使用两个字符串 }
如果不想自定义注解,也可以用Dagger内置的@Named注解简化操作:
// ModuleA @Provides @Named("fromA") fun provideString() = "" // ModuleB @Provides @Named("fromB") fun provideString() = "" // 注入时 @Inject @Named("fromA") lateinit var stringA: String
2. 移除重复的依赖提供
如果两个provideString方法中,有一个是多余的(比如组件实际只需要其中一个String实例),直接删除其中一个Module的provideString方法即可。
3. 合并重复依赖到公共Module
把重复的provideString逻辑抽离到一个公共Module中,让需要该依赖的Module或Component引入这个公共Module,避免重复实现:
// 公共Module class CommonStringModule { @Provides fun provideString() = "公共字符串实例" } // 修改ModuleA和ModuleB,移除各自的provideString class ModuleA{ // 其他Provider方法 } class ModuleB{ // 其他Provider方法 } // 修改ComponentC,引入公共Module @Component(modules = [ModuleA::class, ModuleB::class, CommonStringModule::class]) interface ComponentC{ // Builder代码不变 }
内容的提问来源于stack exchange,提问作者Ishita Garg
相关产品推荐
相关产品推荐

