Вы не показали нам ApplicationContextModule, но из вашего сообщения об ошибке он, вероятно, содержит следующее:
@Provides @ApplicationContext @ApplicationScope
Context getApplicationContext(MyApplication application) {
return application.getApplicationContext();
}
Вы аннотировали этот @Provides
метод с помощью @ApplicationScope
, который инструктирует Dagger сохранитьвозвратил Контекст внутри Компонента - в частности, компонента, который вы также аннотировали @ApplicationScope
.До того, как вы внесли изменения в ваше редактирование, не было совпадений @ApplicationScope
, и Даггер дал вам это сообщение.Теперь, когда он у вас есть, Даггер знает, где хранить сохраненный экземпляр контекста.
Смущает В общем, Даггер не будет возражать против неуместных привязок, которые вы еще не используете, поэтому Даггер победилне возражайте против отсутствия аннотации в области действия компонента, пока вы не начнете использовать привязки в этой области, что, вероятно, произошло примерно в то же время, когда вы ввели область действия фрагмента.
См. также Руководство пользователя кинжала :
Поскольку Dagger 2 связывает экземпляры области в графе с экземплярами реализаций компонентов, самим компонентам необходимо объявить, какую область они намерены представлять.Например, не имеет смысла иметь привязку @Singleton и привязку @RequestScoped в одном и том же компоненте, поскольку эти области имеют разные жизненные циклы и, следовательно, должны жить в компонентах с разными жизненными циклами.Чтобы объявить, что компонент связан с заданной областью действия, просто примените аннотацию области действия к интерфейсу компонента.
Примечательно, что экземпляр Application также не изменяется в течение времени жизни компонента иОжидается, что значение getApplicationContext не изменится за время существования приложения.Это означает, что ваша сфера на самом деле не дает вам много, кроме как избегать повторных вызовов вашего getApplicationContext
метода в ApplicationContextModule.
«Но подождите, я вас слышу»считать.«Почему Dagger не знает , что моя привязка @ApplicationScoped
принадлежит моему ApplicationComponent? В конце концов, Dagger видит ApplicationContextModule установленным на ApplicationComponent, поэтому единственный способ, который имеет смысл, - это если ApplicationComponent неявно @ApplicationScoped
."Две причины: во-первых, в некотором смысле это принудительная документация, которая также помогает Dagger более четко определить, какая привязка ошибочна, чтобы вы случайно не установили привязки @ActivityScoped
непосредственно в свой ApplicationComponent и не убедили Dagger, что ваш компонент одновременно является приложением.ограниченный и ограниченный по активности.Во-вторых, вы также можете аннотировать инъецируемый класс аннотацией области видимости, и Dagger не сможет ничего вывести, потому что нет отношения компонент-установка-модуль, который он мог бы прочитать.Между этими двумя, Dagger заставляет вас аннотировать ваш Компонент в документах, которые я цитировал выше.