2015-06-07 3 views
24

Я использую Dagger 2 и работаю, но теперь мне нужен доступ к Контексту приложений Android.Кинжал 2, вводящий Android Контекст

Непонятно мне, как вводить и получать доступ к контексту. Я попытался сделать это следующим образом:

@Module 
public class MainActivityModule {  
    private final Context context; 

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

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

Однако это приводит к следующим исключением:

java.lang.RuntimeException: Не удалось создать приложение: java.lang.IllegalStateException: mainActivityModule должен быть набор

Если я проверить Dagger сгенерированный код этого возбуждается исключение здесь:

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

Я не уверен, что это правильный способ получить инъекцию Context - любая помощь будет принята с благодарностью.

+0

Я не уверен, если инъекционного Контекст применения имеет смысл. Вы можете расширить класс Application и создать статический экземпляр приложения. Вы можете назвать его, например. 'BaseApplication'. После этого вы можете создать метод 'get()' в расширенном классе Application, который вернет этот экземпляр и будет контекстом приложения одновременно. Затем вы можете использовать следующую конструкцию для достижения Контекста приложений из любого места в своем проекте: 'BaseApplication.get()'. Вы должны использовать его осторожно и только тогда, когда это необходимо. –

ответ

-1

Не удалось правильно создать компонент приложения, необходимый для передачи в приложении. Этот пример Dagger 2 прекрасно показывает, как это сделать: https://github.com/google/dagger/tree/master/examples/android-simple/src/main/java/com/example/dagger/simple

Обновление:
Рабочая ссылка: https://github.com/yongjhih/dagger2-sample/tree/master/examples/android-simple/src/main/java/com/example/dagger/simple

+9

мертвая ссылка, не могли бы вы найти правильный пример? – 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); 
} 

А потом

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

Можете ли вы объяснить, где вы здесь заменяете MainActivityModule? –

+1

@IgorGanapolsky Я не уверен, почему у меня было это с AppContext. Тем не менее, он работает по-разному. – EpicPandaForce

+0

@EpicPandaForce В работе следует использовать DI или просто «это»? Например, чтобы показать диалог в действии –

Смежные вопросы