Hilt迁移多实现接口注入时触发Dagger/DuplicateBindings错误
解决Hilt中多实现类绑定同一接口的重复绑定问题
问题原因
你给SomeInterface同时绑定了First和Second两个实现类,Dagger/Hilt无法自动判断该注入哪一个实例,因此抛出重复绑定的错误。
解决步骤
1. 定义自定义限定符注解
通过限定符标记不同的实现类,创建两个注解用于区分:
import javax.inject.Qualifier; @Qualifier @Retention(RetentionPolicy.RUNTIME) public @interface FirstImpl {} @Qualifier @Retention(RetentionPolicy.RUNTIME) public @interface SecondImpl {}
2. 修改Hilt模块的绑定逻辑
给每个@Provides方法加上对应的限定符,明确绑定关系:
@Module @InstallIn(SingletonComponent.class) public class InterfaceBindingModule { @Provides @FirstImpl // 标记此绑定对应First实现 public SomeInterface getFirst(First first) { return first; } @Provides @SecondImpl // 标记此绑定对应Second实现 public SomeInterface getSecond(Second second) { return second; } }
3. 在注入时指定要使用的实现
在OnePresenter的构造参数上添加限定符,告诉Hilt你需要注入哪个实现的实例:
public class OnePresenter { @Inject public OnePresenter(@FirstImpl SomeInterface someInterface) { // 这里注入的是First类的实例 } // 如果需要使用Second实现,只需把注解换成@SecondImpl即可 // public OnePresenter(@SecondImpl SomeInterface someInterface) {} }
额外优化:简化绑定代码
你也可以直接在实现类的构造器上添加限定符,省去编写Provides方法的步骤:
public class First implements SomeInterface { @Inject @FirstImpl public First(@NonNull final SomeParam someParam){ this.someParam = someParam; } } public class Second implements SomeInterface { @Inject @SecondImpl public Second(@NonNull final SomeParam someParam){ this.someParam = someParam; } }
这种情况下可以直接删除InterfaceBindingModule,Hilt会自动识别带限定符的构造器完成绑定。
内容的提问来源于stack exchange,提问作者Anji
相关产品推荐
相关产品推荐

