2015-06-07 20 views
24

Sto usando Dagger 2 e funziona, tuttavia ora ho bisogno di accedere al contesto dell'applicazione Android.Dagger 2 che inietta Android Context

Non mi è chiaro come iniettare e accedere al contesto. Ho cercato di fare questo nel modo seguente:

@Module 
public class MainActivityModule {  
    private final Context context; 

    MainActivityModule(Context context) { 
     this.context = context; 
    } 

@Provides @Singleton 
Context provideContext() { 
    return context; 
} 

Tuttavia, questo risultato è la seguente eccezione:

java.lang.RuntimeException: impossibile creare applicazioni: java.lang.IllegalStateException: mainActivityModule deve essere set

Se ispezionare il codice Pugnale generato questa eccezione viene sollevata qui:

public Graph build() { 
    if (mainActivityModule == null) { 
     throw new IllegalStateException("mainActivityModule must be set"); 
    } 
    return new DaggerGraph(this); 
} 

Non sono sicuro che questo sia il modo corretto per iniettare Context - qualsiasi aiuto sarà molto apprezzato.

+0

Io non sono sicuro se l'iniezione di contesto di applicazione ha senso. È possibile estendere la classe Application e creare un'istanza statica dell'applicazione. Puoi chiamarlo ad es. 'BaseApplication'. Dopodiché, puoi creare il metodo 'get()' all'interno della tua classe Application estesa, che restituirà quell'istanza e sarà Application Context allo stesso tempo. Quindi, puoi utilizzare la seguente struttura per raggiungere il contesto dell'applicazione da qualsiasi posizione nel tuo progetto: 'BaseApplication.get()'. Dovresti usarlo con attenzione e solo quando è necessario. –

risposta

-1

Non stava creando correttamente il componente Application, necessario per passare nell'applicazione. Questo esempio Dagger 2 mostra perfettamente come fare: https://github.com/google/dagger/tree/master/examples/android-simple/src/main/java/com/example/dagger/simple

Aggiornamento:
lavoro link: https://github.com/yongjhih/dagger2-sample/tree/master/examples/android-simple/src/main/java/com/example/dagger/simple

+9

dead link, potresti trovare l'esempio giusto? – galex

20
@Module 
public class MainActivityModule {  
    private final Context context; 

    public MainActivityModule (Context context) { 
     this.context = context; 
    } 

    @Provides //scope is not necessary for parameters stored within the module 
    public Context context() { 
     return context; 
    } 
} 

@Component(modules={MainActivityModule.class}) 
@Singleton 
public interface MainActivityComponent { 
    Context context(); 

    void inject(MainActivity mainActivity); 
} 

E poi

MainActivityComponent mainActivityComponent = DaggerMainActivityComponent.builder() 
    .mainActivityModule(new MainActivityModule(MainActivity.this)) 
    .build(); 
+0

Puoi spiegare dove stai sostituendo MainActivityModule qui? –

+1

@IgorGanapolsky Non sono sicuro del motivo per cui l'ho avuto con AppContext. Funziona essenzialmente allo stesso modo, però. – EpicPandaForce

+0

@EpicPandaForce In un'attività, dovrei usare DI o solo "questo"? Ad esempio, per mostrare una finestra di dialogo in un'attività –