Dagger2在注入类的类中注入时出错 [英] Dagger2 Error at inject in a class who injects

查看:138
本文介绍了Dagger2在注入类的类中注入时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在我的演示者演示者但给了我一个错误,看来我无法在一个注入了另一个类的类中注入它: [Dagger / DuplicateBindings] com.example.calculadora.Data.Interactor.Operacion绑定了多次:
@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在
com.example.calculadora.Domain.PresenterImpl.operacion
com.example.calculadora.Domain.PresenterImpl i中注入.Data.Interactor.Operacion在
com.example.calculadora.Inject.InteractorComponent.inject(com.example.calculadora.Domain.PresenterImpl)中注入s

这是我的 InteractorModule ,它根据我想使用的方式为我提供了4个类,而问题出在哪里:

  @Module 
公共类InteractorModule {
@Provides
public Operacion ProvideSuma(){
return new InteractorSuma();
}

@Provides
public OperacprovideResta(){
return new InteractorResta();
}

@Provides
public OperacprovideDiv(){
return new InteractorDivision();
}

@Provides
public OperacprovideMult(){
return new InteractorMultiplicacion();
}
}

我想在这里注入而不是初始化新项目:

  @Override 
public void setCalculo(){
Operacion operationc = null;
String []操作数= vista.getOperandos();
Operandooperndo1 = new Operando(Integer.parseInt(operandos [0]));
Operandooperndo2 = new Operando(Integer.parseInt(operandos [1]));


开关(tipoOperacion){
case SUMA:
操作数=新的InteractorSuma(operando1,operndo2);
休息时间;
case RESTA:
操作=新的InteractorResta(operando1,operndo2);
休息时间;
case MULT:
操作=新的InteractorMultiplicacion(operando1,operndo2);
休息时间;
case DIV:
操作=新的InteractorDivision(operando1,operndo2);
休息时间;
}

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


解决方案

您应该将另一个分开带有 @Named( someName)注释,或者您可以按照@Derek的说明进行操作。我的方法:

  @Provides 
@Named( someName1)
public Operacion ProvideSuma(){
返回新的InteractorSuma();
}

@Provides
@Named( someName2)
Public Operacion ProvideResta(){
return new InteractorResta();
}

@Provides
@Named( someName3)
public OperacprovideDiv(){
return new InteractorDivision();
}

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

否则,匕首不知道返回哪一个。



在注入时也调用 @Named


I'm trying to inject in my presenter an interactor but gives me an error, at seems I can't inject in a class who injects to another:

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)

This is my InteractorModule who provides me a 4 classes depending wich I want to use and where seems is the problem:

@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();
    }
}

I want to inject here instead of init the new items:

@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()));
}

解决方案

You should separate one-other with the @Named("someName") annotation, or you could just do what @Derek says. My approach:

@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();
    }

Otherwise dagger doesn't know which one to return where.

Call the @Named when injecting also.

这篇关于Dagger2在注入类的类中注入时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆