2015-06-07 11 views
24

Ich benutze Dolch 2 und habe es funktioniert, aber ich brauche jetzt Zugriff auf den Android Application Context.Dolch 2 injiziert Android-Kontext

Es ist mir nicht klar, wie zu injizieren und Zugriff auf den Kontext bekommen. Ich habe versucht, dies zu tun, wie folgt:

@Module 
public class MainActivityModule {  
    private final Context context; 

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

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

jedoch dies in der folgenden Ausnahme ergibt:

java.lang.RuntimeException: Kann Anwendung erstellen: java.lang.IllegalStateException: mainActivityModule muss sein set

Wenn ich den Dolch generierten Code diese Ausnahme inspizieren wird hier angesprochen:

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

Ich bin mir nicht sicher, ob dies der richtige Weg ist, Context injiziert zu bekommen - jede Hilfe wird sehr geschätzt.

+0

Ich bin nicht sicher, ob die Injektion Anwendungskontext macht Sinn. Sie können die Application-Klasse erweitern und eine statische Instanz der Anwendung erstellen. Sie können es z.B. 'BaseApplication'. Danach können Sie die Methode 'get()' in Ihrer erweiterten Application-Klasse erstellen, die diese Instanz zurückgibt und gleichzeitig Application Context ist. Dann können Sie die folgende Konstruktion verwenden, um den Anwendungskontext von einer beliebigen Stelle in Ihrem Projekt zu erreichen: 'BaseApplication.get()'. Sie sollten es vorsichtig und nur dann verwenden, wenn es notwendig ist. –

Antwort

-1

Die Anwendungskomponente wurde nicht ordnungsgemäß erstellt, die zum Übergeben der Anwendung benötigt wird. Dieser Dolch 2 Beispiel perfekt zeigt, wie dies zu tun: https://github.com/google/dagger/tree/master/examples/android-simple/src/main/java/com/example/dagger/simple

Update:
Arbeits Link: https://github.com/yongjhih/dagger2-sample/tree/master/examples/android-simple/src/main/java/com/example/dagger/simple

+9

tote Verbindung, könnten Sie das richtige Beispiel finden? – 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); 
} 

Und dann

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

Können Sie hier erklären, wo Sie MainActivityModule ersetzen? –

+1

@IgorGanapolsky Ich bin nicht sicher, warum ich es mit AppContext hatte. Es funktioniert jedoch im Wesentlichen auf die gleiche Weise. – EpicPandaForce

+0

@EpicPandaForce In einer Aktivität, sollte ich DI oder nur 'das' verwenden? Zum Beispiel, um einen Dialog in einer Aktivität anzuzeigen –