我试图在我的inject
中使用presenter
an 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()));
}
发布于 2019-06-20 15:09:26
你应该用@Named("someName")
注释把另一个分开,或者你可以按@德里克说的去做。我的方法:
@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
。
发布于 2019-06-20 15:17:53
对于这种情况,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) { }
}
发布于 2019-06-20 15:20:46
因为dagger查找返回类型,而不是函数的名称,所以您应该处理它。然而,Dagger2为这些问题提供了解决方案。使用@Named注释。
有时,单独的类型不足以识别依赖项。例如,如果您需要一个带有GsonConverterFactory的Refrofit实例和另一个ScalarConverterFactory,那么最终将得到两个具有相同返回类型的方法: Retrofit。在这种情况下,您可以使用@Named注释来区分两个Retrofit实例
现在,您可以像下面这样使用它
来处理你的案子
@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
注释的完整示例
如果你还有什么问题请告诉我
https://stackoverflow.com/questions/56688817
复制相似问题