2015-06-07 23 views
24

Używam Dagger 2 i działa, ale teraz potrzebuję dostępu do kontekstu aplikacji Android.Sztylet 2 wstrzykuje kontekst Androida

Nie jest dla mnie jasne, jak wstrzyknąć i uzyskać dostęp do kontekstu. Próbowałem to zrobić w następujący sposób:

@Module 
public class MainActivityModule {  
    private final Context context; 

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

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

Jednak wynika to w następujący wyjątek:

java.lang.RuntimeException: Nie można utworzyć aplikację: java.lang.IllegalStateException: mainActivityModule musi być ustawić

Gdybym skontrolować Dagger wygenerowany kod ten jest wyjątek tutaj:

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

Nie jestem pewien, czy to jest właściwy sposób na wstrzyknięcie Kontekstu - każda pomoc będzie bardzo ceniona.

+0

Nie jestem pewien, czy wstrzykiwanie Kontekst aplikacji ma sens. Możesz rozszerzyć klasę aplikacji i utworzyć statyczną instancję aplikacji. Możesz nazwać go np. 'BaseApplication'. Następnie możesz utworzyć metodę get() w rozszerzonej klasie aplikacji, która zwróci to wystąpienie i będzie kontekstem aplikacji w tym samym czasie. Następnie możesz użyć następującej konstrukcji, aby dotrzeć do kontekstu aplikacji z dowolnego miejsca w projekcie: 'BaseApplication.get()'. Powinieneś używać go ostrożnie i tylko wtedy, gdy jest to konieczne. –

Odpowiedz

-1

Niepoprawne budowanie składnika aplikacji potrzebnego do przekazania aplikacji. Ten Dagger 2 przykład doskonale pokazuje, jak to zrobić: https://github.com/google/dagger/tree/master/examples/android-simple/src/main/java/com/example/dagger/simple

Aktualizacja:
działający link: https://github.com/yongjhih/dagger2-sample/tree/master/examples/android-simple/src/main/java/com/example/dagger/simple

+9

martwy link, czy mógłbyś znaleźć odpowiedni przykład? – 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); 
} 

A potem

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

Czy możesz wyjaśnić, gdzie zastępujesz MainActivityModule tutaj? –

+1

@IgorGanapolsky Nie jestem pewien, dlaczego miałem go z AppContext. Działa jednak w zasadzie w ten sam sposób. – EpicPandaForce

+0

@EpicPandaForce Czy w działaniu powinienem używać DI lub tylko "tego"? Na przykład, aby wyświetlić okno dialogowe w działaniu –