首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >注入类中注入时的Dagger2错误

注入类中注入时的Dagger2错误
EN

Stack Overflow用户
提问于 2019-06-20 15:01:36
回答 4查看 129关注 0票数 0

我试图在我的inject中使用presenter an interactor,但是给出了一个错误,似乎我不能在一个向另一个类注入的类中注入:

代码语言:javascript
运行
复制
error: [Dagger/DuplicateBindings] com.example.calculadora.Data.Interactor.Operacion is bound multiple times:
@Provides com.example.calculadora.Data.Interactor.Operacion com.example.calculadora.Inject.InteractorModule.provideDiv()
@Provides com.example.calculadora.Data.Interactor.Operacion com.example.calculadora.Inject.InteractorModule.provideMult()
@Provides com.example.calculadora.Data.Interactor.Operacion com.example.calculadora.Inject.InteractorModule.provideResta()
@Provides com.example.calculadora.Data.Interactor.Operacion com.example.calculadora.Inject.InteractorModule.provideSuma()
com.example.calculadora.Data.Interactor.Operacion is injected at
com.example.calculadora.Domain.PresenterImpl.operacion
com.example.calculadora.Domain.PresenterImpl is injected at
com.example.calculadora.Inject.InteractorComponent.inject(com.example.calculadora.Domain.PresenterImpl)

这是我的InteractorModule,他为我提供了4个类,这取决于我想使用哪个类,问题在哪里:

代码语言:javascript
运行
复制
@Module
public class InteractorModule {
    @Provides
    public Operacion provideSuma() {
        return new InteractorSuma();
    }

    @Provides
    public Operacion provideResta() {
        return new InteractorResta();
    }

    @Provides
    public Operacion provideDiv() {
        return new InteractorDivision();
    }

    @Provides
    public Operacion provideMult() {
        return new InteractorMultiplicacion();
    }
}

我想在这里注入,而不是插入新的项目:

代码语言:javascript
运行
复制
@Override
public void setCalculo() {
    Operacion operacion = null;
    String[] operandos = vista.getOperandos();
    Operando operando1 = new Operando(Integer.parseInt(operandos[0]));
    Operando operando2 = new Operando(Integer.parseInt(operandos[1]));


    switch (tipoOperacion) {
        case SUMA:
            operacion = new InteractorSuma(operando1, operando2);
            break;
        case RESTA:
            operacion = new InteractorResta(operando1, operando2);
            break;
        case MULT:
            operacion = new InteractorMultiplicacion(operando1, operando2);
            break;
        case DIV:
            operacion = new InteractorDivision(operando1, operando2);
            break;
    }

    operacion.calcular();
    vista.mostrarResultado(String.valueOf(operacion.getResultado().getValor()));
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-20 15:09:26

你应该用@Named("someName")注释把另一个分开,或者你可以按@德里克说的去做。我的方法:

代码语言:javascript
运行
复制
@Provides
@Named("someName1")
    public Operacion provideSuma() {
        return new InteractorSuma();
    }

    @Provides
    @Named("someName2")
    public Operacion provideResta() {
        return new InteractorResta();
    }

    @Provides
    @Named("someName3")
    public Operacion provideDiv() {
        return new InteractorDivision();
    }

    @Provides
    @Named("someName4")
    public Operacion provideMult() {
        return new InteractorMultiplicacion();
    }

否则匕首不知道该回哪里去。

注射时也调用@Named

票数 2
EN

Stack Overflow用户

发布于 2019-06-20 15:17:53

对于这种情况,Dagger2 Qualifiers就是为之构建的。

1.-创建限定符:

代码语言:javascript
运行
复制
@Qualifier
public @interface OperacionSuma {}
@Qualifier
public @interface OperacionResta {}
@Qualifier
public @interface OperacionDiv {}
@Qualifier
public @interface OperacionMult {}

2.-在提供程序方法中设置限定符:

代码语言:javascript
运行
复制
@Module
public class InteractorModule {
    @Provides
    @OperacionSuma
    public Operacion provideSuma() {
        return new InteractorSuma();
    }

    @Provides
    @OperacionResta
    public Operacion provideResta() {
        return new InteractorResta();
    }

    @Provides
    @OperacionDiv
    public Operacion provideDiv() {
        return new InteractorDivision();
    }

    @Provides
    @OperacionMult
    public Operacion provideMult() {
        return new InteractorMultiplicacion();
    }
} 

3.-指定要在演示者中插入什么样的“操作”:

代码语言:javascript
运行
复制
class Presenter {

    @Inject
    Presenter(@OperacionSuma Operacion operacion) { }

    @Inject
    Presenter(@OperacionResta Operacion operacion) { }

    @Inject
    Presenter(@OperacionDiv Operacion operacion) { }

    @Inject
    Presenter(@OperacionMult Operacion operacion) { }
}
票数 2
EN

Stack Overflow用户

发布于 2019-06-20 15:20:46

因为dagger查找返回类型,而不是函数的名称,所以您应该处理它。然而,Dagger2为这些问题提供了解决方案。使用@Named注释。

有时,单独的类型不足以识别依赖项。例如,如果您需要一个带有GsonConverterFactory的Refrofit实例和另一个ScalarConverterFactory,那么最终将得到两个具有相同返回类型的方法: Retrofit。在这种情况下,您可以使用@Named注释来区分两个Retrofit实例

现在,您可以像下面这样使用它

来处理你的案子

代码语言:javascript
运行
复制
@Module
public class InteractorModule {
    @Provides
    @Named("InteractorSuma")
    public Operacion provideSuma() {
        return new InteractorSuma();
    }

    @Provides
    @Named("InteractorResta")
    public Operacion provideResta() {
        return new InteractorResta();
    }

    @Provides
    @Named("InteractorDivision")
    public Operacion provideDiv() {
        return new InteractorDivision();
    }

    @Provides
    @Named("InteractorMultiplicacion")
    public Operacion provideMult() {
        return new InteractorMultiplicacion();
    }
}

这是如何使用@Named注释的完整示例

如果你还有什么问题请告诉我

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56688817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档