Чтобы добавить к тому, что ответил Мигель Пин, вот другой раздел из документации , который также отвечает на это:
Короткая версия: используйте ApplicationContext, если у вас нет действительно хорошая причина для этого. Для тех из вас, кто ищет немного большую глубину в отношении «но почему» вышеупомянутой рекомендации, продолжайте читать.
(разместите это для любых будущих новичков, которые могут прочитать этот вопрос )
При разработке на Kotlin вы должны добавить следующие строки рядом с annotationProcessor
их аналогами:
kapt 'com.google.dagger:dagger-android-processor:2.15'
kapt 'com.google.dagger:dagger-compiler:2.15'
и добавить apply plugin: 'kotlin-kapt'
в начале того же файла.
Этот раздел выглядит для меня так:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt' // <- Add this line
apply plugin: 'io.fabric'
Если у вас есть несколько модулей в AndroidStudio (модули в терминах Android Studio, а не Dagger), другой возможной причиной сбоя является то, что вы забыли поместить процессоры аннотаций во все модули »build.gradle
.
Мы разделили наше приложение на несколько модулей, обновили зависимости от использования implementation
до использования api
, но забыли соответствующим образом обработать процессоры аннотаций.
Итак, вы можете иметь эти строки только в корневом модуле:
api 'com.google.dagger:dagger-android:2.16'
// if you use the support libraries
api 'com.google.dagger:dagger-android-support:2.16'
Но эти должны быть указаны во всех зависимостях модулей:
annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
// if you use injections to Android classes
annotationProcessor 'com.google.dagger:dagger-android-processor:2.16'
Вот решение для нового проекта Dagger.
Эти две строки отвечают за создание структуры времени компиляции в Dagger 2.
compile 'com.google.dagger:dagger:2.14.1'
// создает структуру во время компиляции
annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'
// создает структуру во время компиляции на основе аннотации, которые вы предоставили.
Полная настройка Dagger
//dagger 2
compile 'com.google.dagger:dagger:2.14.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'
//to enable DaggerActivity, DaggerBroadcastReceiver, DaggerFragment etc classes
compile 'com.google.dagger:dagger-android:2.14.1'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.14.1'
//support libraries with dagger 2
compile 'com.google.dagger:dagger-android-support:2.14.1'
Примечание : необходимо настроить процесс аннотации, как показано на скриншоте ниже. Вы можете сделать это File>Other Settings>Default Settings>
поиск "Annotation processor"
Может быть, вы забыли аннотировать ModuleClass с помощью @Module?
Если Dagger2 не может сгенерировать свои компоненты, это означает, что в вашем коде есть ошибки с областями действия / модулями. Проверьте наши методы @ Provides / Inject.
UPD:
Вы должны внедрить свои компоненты в случаи, когда вам нужны экземпляры классов, предоставляемые модулем.
как
inject(MainActivity main);
В приложении build.gradle вам нужно добавить необходимые зависимости для Dagger для генерации соответствующих классов, как показано ниже:
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21' // if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
вы должны изменить версию используемого кинжала.
см. Полный документ кинжала в этом
.В приведенном выше коде есть несколько незначительных заблуждений / ошибок, вот рабочая реализация:
Application.java:
component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();
Сгенерированный класс будет назван DaggerComponentClass
, а не DaggerCompClassComponent
. Если вы не можете запустить свое приложение в Android Studio, чтобы его собрать, попробуйте в меню Build-> Clean project и Build-> Rebuild project. Если все в порядке, Dagger скомпилирует DaggerComponentClass
, который будет находиться в том же пакете, что и ComponentClass
.
ComponentClass.java:
@Component(modules = ModuleClass.class)
public interface ComponentClass {
void inject(AClassThatShouldGetInstancesInjected instance);
}
Компонент в Dagger2 имеет методы с именем inject
, которые получают экземпляр для вставки в него экземпляров, а не наоборот. В приведенном выше коде класс AClassThatShouldGetInstancesInjected
обычно вызывает componentClass.inject(this);
, чтобы получить экземпляры, внедренные в себя.
ModuleClass.java:
@Module
public class ModuleClass {
@Provides
@Singleton
public Interceptor provideInterceptor() {/*code*/}
//Your Providers...
}
Модуль корректен в вашем коде, убедитесь, что он аннотирован.
Если вы используете Kotlin, обязательно добавьте плагин Gradle kapt
(процессор аннотаций Kotlin) в ваш скрипт сборки и используйте kapt
тип зависимости Gradle вместо annotationProcessor
для Dagger Compiler.
apply plugin: 'kotlin-kapt
kapt deps.daggercompiler
implementation deps.dagger
//add all the dependencies otherwise component class will not be generated.
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'