簡體   English   中英

Dagger2在注入類的類中注入時出錯

[英]Dagger2 Error at inject in a class who injects

我試圖在presenter inject一個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()));
}

對於這種情況,需要構建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) { }
}

您應該使用@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

由於dagger尋找返回類型,而不是函數的名稱,因此您應該注意它。 但是,Dagger2提供了解決此類問題的方法。 使用@Named注釋。

有時,僅類型本身不足以識別依賴項。 例如,如果您需要一個帶有GsonConverterFactory的Refrofit實例和另一個ScalarConverterFactory的Refrofit實例,您將最終得到2個提供具有相同返回類型的方法: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注釋的完整示例

讓我知道你是否還有問題

返回子類的實例,而不是父類的實例。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM