0

Dies macht mich verrückt. Ich kann mir nicht vorstellen, was das Problem damit ist.Cant herauszufinden, "kann nicht ohne eine @ bereitgestellt-kommentierte Methode" Fehler

Code:

public interface IMinutesCounter { 
    void startTimer(); 

    void stopTimer(); 
} 

und Umsetzung:

public class MinutesMonitor implements IMinutesCounter { 
    private ITimerCallback timerCallback; 

    @Inject 
    public MinutesMonitor(ITimerCallback timerCallback) { 
     this.timerCallback = timerCallback; 
    } 

    void startTimer(){...} 

    void stopTimer(){...} 
} 

CallAlarm Umsetzung ITimerCallback

public class CallAlarm implements MinutesMonitor.ITimerCallback { 

    @Inject 
    public IMinutesCounter minutesMonitor; 


    public CallAlarm (HealthService context) { 
     this.minutesMonitor = minutesMonitor; 
     .... 
    } 
} 

Wie Sie sehen können, IMinutesCounter benötigt eine MinutesMonitor.ITimerCallback.

Was ich will, ist - ** Von der CallAlarm Klasse (implementierende MinutesMonitor.ITimerCallback) ** injizieren mich (this) die IMinutesCounter zu instanziiert.

Dagger 2 Teil:

@Module 
public class CallAlarmModule { 

    IMinutesCounter.ITimerCallback timerCallBack; 


    public CallAlarmModule(IMinutesCounter.ITimerCallback timerCallBack) { 
     this.timerCallBack = timerCallBack; 
    } 

    @Provides 
    public IMinutesCounter.ITimerCallback provideCallAlarm() { 
     return timerCallBack; 
    } 
} 

und:

@Component(modules = CallAlarmModule.class) 
public interface CallAlarmComponent { 
    void injectTimerCallback(IMinutesCounter.ITimerCallback service); 
} 

es gibt mir

error: IMinutesCounter cannot be provided without an @Provides- or @Produces-annotated method.

Antwort

0

Das bedeutet, dass Dolch nicht weiß, was ein IMinutesCounter ist oder wohin nimm eins.

Während der Dolch über MinutesMonitor weiß und mit Konstruktorinjektion konstruieren kann, geben Sie nicht an, was für IMinutesCounter zu verwenden ist.

Sie können nur die Schnittstelle entfernen und hängen nur auf MinutesMonitor, aber ich vermute, dass Sie tatsächlich die Schnittstelle und deren Umsetzung verwenden möchten, für die Sie bieten die Umsetzung haben wird, da der Fehler vermuten lässt.

In Ihrem Modul hinzufügen etwas wie das folgende

@SomeScope // maybe add some scope 
@Provides 
public IMinutesCounter provideMinutesCounter(MinutesMonitor monitor) { 
    return monitor; 
} 

Dieser Code-Schnipsel Verwendung von Konstruktor Injektion macht. Es sagt , um eine IMinuteCounter Ich brauche eine MinutesMonitor — ihre Implementierung. Sie geben dann einfach die Implementierung zurück, und Dolch kann Ihre Implementierung verwenden, wo die Schnittstelle angefordert wird.

@SomeScope // maybe add some scope 
@Provides 
public IMinutesCounter provideMinutesCounter(/* MM dependencies */) { 
    return new MinutesMonitor(/* MM dependencies */); 
} 

Das gleiche könnte sich nur um die Erstellung der Aufgabe getan werden, aber ich denke, Sie sehen, warum die Dinge einfacher, nur mit Konstruktor Injektion macht.

+0

danke für deine antwort. Wenn ich die Variable in CallAlarm so ändere, dass sie wie gesagt MinutesMonitor ist, bekomme ich denselben Fehler aber über ITimerCallback - "ITimerCallback kann nicht ohne eine Provided- oder Producens-Annotated-Methode bereitgestellt werden", und wenn ich dann im MinutesMonitor den Konstruktor ändere accept "CallAlarm" anstelle von "ITimerCallback" -> Ich bekomme "dependency cycle" Fehler –

+0

@OfekAgmon Ja, das ist das gleiche Problem, wieder, mit der Schnittstelle nicht gefunden. Sie sollten Ihre Schnittstellen wahrscheinlich bereitstellen und sich nicht auf Ihre Implementierung verlassen, wie in den 2 Codebeispielen unten gezeigt. der Zyklus ist ein ganz anderes Problem, für das es keine _easy_ Lösung gibt, können Sie darüber lesen, wenn Sie nur nach '[dagger-2] zyklischen' oder '[dagger-2] Zyklus suchen, hier auf SO –

+0

Ich fügte hinzu ersten Snippet, den du gepostet hast, und den anderen Code gelassen hast, wie es ist - ich habe immer noch denselben Fehler, kann IMinutesCounter –

0

Ich glaube, Sie leicht diese mit dem folgenden zusätzlichen Zeile beheben:

@Module 
public class CallAlarmModule { 
    @Provides 
    public IMinutesCounter minutesCounter(MinutesCounter minutesCounter) { 
     return minutesCounter; 
    } 

    ... 
+0

Ich fügte diese Methode hinzu, der Fehler ist immer noch derselbe –

+0

Auch Ihr 'CallAlarm' empfängt nicht wirklich einen' minutesMonitor', obwohl es sollte in seinem Konstruktor – EpicPandaForce

+0

Ich habe es hinzugefügt, jetzt heißt es "kann ITimerCallback nicht bieten" –

0
@Inject 
public IMinutesCounter minutesMonitor; 

Änderung

@Inject 
public MinutesCounter minutesMonitor; 

Ursache Ihrer Schnittstelle nicht injiziert werden kann.

Verwandte Themen