2015-05-30 8 views
11

Ho il seguente modulo di semplice:Il contesto non può essere fornito senza un metodo @ Fornisce-annotato, ma lo è?

@Module 
public class ApplicationModule { 

    private CustomApplication customApplication; 

    public ApplicationModule(CustomApplication customApplication) { 
     this.customApplication = customApplication; 
    } 

    @Provides @Singleton CustomApplication provideCustomApplication() { 
     return this.customApplication; 
    } 

    @Provides @Singleton @ForApplication Context provideApplicationContext() { 
     return this.customApplication; 
    } 

} 

E il rispettivo componente semplice:

@Singleton 
@Component(
     modules = ApplicationModule.class 
) 
public interface ApplicationComponent { 

    CustomApplication getCustomApplication(); 

    Context getApplicationContext(); 

} 

E sto creando il componente qui:

public class CustomApplication extends Application { 

    ... 

    private ApplicationComponent component; 

    @Override 
    protected void attachBaseContext(Context base) { 
     super.attachBaseContext(base); 
     MultiDex.install(this); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     component = DaggerApplicationComponent.builder() 
       .applicationModule(new ApplicationModule(this)) 
       .build(); 

getta questo errore a compile time: Error:(22, 13) error: android.content.Context cannot be provided without an @Provides-annotated method, ma come puoi vedere è annotato con @Provides.

È davvero strano perché il problema scompare quando togli l'annotazione del qualificatore.

Solo nel caso, questo è il mio @ForApplication qualificazione:

@Qualifier @Retention(RUNTIME) 
public @interface ForApplication { 
} 

Questo è praticamente un libro di testo Dagger2 esempio. Che cosa sto facendo di sbagliato?

risposta

21

Dopo un po 'di tentativi ed errori, ho trovato la causa, è l'ambiguità di Context perché @ForApplication manca in alcuni punti in cui è necessario Context.

Inoltre potrebbe essere la mia delicata comprensione di Dagger2 al momento, ma questo boilerplate è abbastanza incline agli errori degli sviluppatori.

Comunque ... per tutti coloro che trova il problema è sufficiente aggiungere le annotazioni di qualificazione in ogni luogo che la dipendenza è usato:

@Singleton 
@Component(
     modules = ApplicationModule.class 
) 
public interface ApplicationComponent { 

    CustomApplication getCustomApplication(); 

    @ForApplication Context getApplicationContext(); 

} 
+0

Stesso problema qui. Ho dovuto aggiungere '@ ForApplication' al mio costruttore:' @Inject MyThing (@ForApplication Context context) {this.context = context; } ' – anon

+0

Non ha senso. Dove stai effettivamente chiamando 'getApplicationContext()' da ?? –

+0

Potresti elaborare ciò che esattamente non ha senso? Non sto chiamando questo metodo, è solo una dichiarazione per il componente Dagger2. Sto solo dicendo che l'annotazione mancava nella dichiarazione di 'Context' in quell'ambito. Ecco perché ho ricevuto l'errore, perché il mio modulo ha specificato che il contesto fornito era '@ ForApplication 'e il mio componente no. – Eddnav

Problemi correlati