Dagger2在注入类的类中注入时出错

时间:2019-06-20 15:01:36

标签: java android dagger-2 mvp

我正在尝试在injectpresenter中插入interactor,但给了我一个错误,看来我无法注入要注入另一个的类:

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个类,问题出在哪里:

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

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

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

4 个答案:

答案 0 :(得分:2)

在这种情况下,Dagger2 Qualifiers是为之构建的。

1.-创建您的限定词:

@Qualifier
public @interface OperacionSuma {}
@Qualifier
public @interface OperacionResta {}
@Qualifier
public @interface OperacionDiv {}
@Qualifier
public @interface OperacionMult {}

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

@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.-指定要在演示者中注入的“操作”类型:

class Presenter {

    @Inject
    Presenter(@OperacionSuma Operacion operacion) { }

    @Inject
    Presenter(@OperacionResta Operacion operacion) { }

    @Inject
    Presenter(@OperacionDiv Operacion operacion) { }

    @Inject
    Presenter(@OperacionMult Operacion operacion) { }
}

答案 1 :(得分:1)

您应该使用@Named("someName")注释将其他人分开,否则您可以按照@Derek的说明进行操作。我的方法:

@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 :(得分:1)

由于匕首查找返回类型,而不是为函数指定的名称,因此您应该注意它。但是,Dagger2提供了解决此类问题的方法。使用@Named注释。

  

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

enter image description here

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

enter image description here

针对您的情况

$ scalac 'Test.scala:12: error: could not find implicit value for parameter b: B
def foo()(implicit a: A) = bar()
^
one error found

Here is有关如何使用Create table #MyTable ( col1 , col2 ... ); INSERT INTO #MyTable (col1, col2 ...) SELECT col1, col2 FROM LinkedServer..RemoteSchema.RemoteTable 注释的完整示例

让我知道您是否仍然有问题

答案 3 :(得分:0)

返回Child类而不是父类的实例。

@Module
public class InteractorModule {
    @Provides
    public InteractorSuma provideSuma() {
        return new InteractorSuma();
    }

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

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

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