2014-05-02 8 views
12

Indietro quando ho usato RoboGuice, sono stato in grado di construire inject Context nelle mie classi e RoboGuice avrebbe scelto il contesto appropriato (inject in un'attività avrebbe il contesto Activity, inject in Application avrebbe il contesto dell'applicazione corrente, inietti in un Frammento avrebbe il contesto di attività del frammento, ecc ...).Daga con Android: come faccio a iniettare il contesto corrente?

Esiste un metodo simile per ottenere questo risultato con Dagger?

public class Thing { 
    @Inject 
    public class Thing(Context context){ 
     // if i'm injected in an Activity, I should be the current activity's context 
     // if i'm injected in an Fragment, I should be the fragment's activity context 
     // if i'm injected in a Service, I should be the service's context 
     // etc... 
    } 
} 

risposta

23

Dagger non conosce Android. O qualsiasi cosa, davvero. Se vuoi iniettare qualcosa, devi dirlo a Dagger.

È possibile visualizzare un esempio di come iniettare un in the examples. In questo caso, viene utilizzato un qualificatore per differenziare l'applicazione da un'attività 1.

/** 
* Allow the application context to be injected but require that it be annotated with 
* {@link ForApplication @Annotation} to explicitly differentiate it from an activity context. 
*/ 
@Provides @Singleton @ForApplication Context provideApplicationContext() { 
    return application; 
} 

Modifica

No, non si può iniettare un tipo senza riserve e hanno l'istanza di cambiamento che tipo in base al contesto in cui si sta eseguendo l'iniezione. Dagger richiede che l'origine di un tipo sia nota in fase di compilazione e poiché i grafici degli oggetti sono immutabili, tale origine non può essere modificata.

L'unico modo per farlo è utilizzare una factory che consente di specificare il contesto con cui verrà creato l'oggetto.

+0

Quando ho provato il metodo ForApplication, sono stato costretto dal compilatore ad annotare anche il membro iniettabile effettivo con ForApplication - giusto? Ho modificato la mia domanda con un po 'di codice di esempio. Dovrei inserire qui l'annotazione: public class Thing (contesto del contesto ForApplication). Ma questo mi fa sembrare che avrei sempre e solo il contesto dell'applicazione, è corretto? – Paul

+0

Questo è corretto. Ho aggiornato la mia risposta. –

+0

Il metodo di fabbrica è esattamente il tipo di codice della piastra della caldaia che Dagger dovrebbe sostituire. È fastidioso che non ci sia modo di passare argomenti a ObjectGraph.get(). – enl8enmentnow