Dagger2 Error At Inject In A Class Who Injects
Solution 1:
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.
Solution 2:
For this kind of situation is where Dagger2 Qualifiers are build for.
1.- Create your qualifiers:
@Qualifier
public @interface OperacionSuma {}
@Qualifier
public @interface OperacionResta {}
@Qualifier
public @interface OperacionDiv {}
@Qualifier
public @interface OperacionMult {}
2.- Set qualifiers in your providers methods:
@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.- Specify what kind of "operation" do you want to inject in your presenter:
class Presenter {
@Inject
Presenter(@OperacionSuma Operacion operacion) { }
@Inject
Presenter(@OperacionResta Operacion operacion) { }
@Inject
Presenter(@OperacionDiv Operacion operacion) { }
@Inject
Presenter(@OperacionMult Operacion operacion) { }
}
Solution 3:
Since dagger looks for the return type, not a name that given to the function you should take care of it. However, Dagger2 provides a solution to such problems. Using @Named annotation.
Sometimes the type alone is insufficient to identify a dependency. For example, if you need a Refrofit instance with GsonConverterFactory and another one ScalarConverterFactory you will end up with 2 provide methods that have the same return type: Retrofit. In this case, you can use @Named annotation to differentiate two Retrofit instances
Now you can use it like following
Coming to your case
@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();
}
}
Here is the full example of how to use @Named annotation
Let me know if you have still a problem
Solution 4:
Return the instance of Child class, not parent class.
@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();
}
}


Post a Comment for "Dagger2 Error At Inject In A Class Who Injects"