Dagger @ContributesAndroidInjector ComponentProcessor не смог обработать этот интерфейс

Я тестировал новую функцию кинжала: модуль Android. И я не могу скомпилировать код, когда я использую @ContributesAndroidInjector я всегда получаю следующую ошибку:

Ошибка: (12, 8) ошибка: dagger.internal.codegen.ComponentProcessor не удалось обработать этот интерфейс, поскольку не все его зависимости могут быть разрешены. Проверьте на ошибки компиляции или циклическую зависимость с сгенерированным кодом.

Я пытался реализовать свои компоненты, как здесь, но все же я получил ошибку.

Вот самый маленький пример:

@PerApplication
@Component(modules = {AndroidInjectionModule.class, LoginBindingModule.class})
public interface ApplicationComponent {
    void inject(ExampleApplication application);
}

@Module
public abstract class LoginBindingModule {
    @ContributesAndroidInjector
    abstract LoginActivity contributeYourActivityInjector();
}

public class LoginActivity extends Activity {

    @Inject
    LoginPresenter loginPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
    }
}

public class LoginPresenter {

    @Inject
    public LoginPresenter() {

    }
}

Если я удалю LoginBindingModule из ApplicationComponent, приложение будет построено, но произойдет сбой с исключением времени выполнения:

java.lang.IllegalArgumentException: фабрика инжекторов не привязана к классу

настройка проекта:

gradle 3.3
buildToolsVersion "25.0.2"
dagger 2.11

Ответ 1

Добавление annotationProcessor "com.google.dagger:dagger-android-processor:2.11" в ваш файл gradle решит вашу проблему.

Ответ 2

В моем случае класс SomeModule содержал ненужные строки:

@ContributesAndroidInjector
internal abstract fun fragmentInjector(): SomeFragment

Ответ 3

Для Котлина вместо

annotationProcessor com.google.dagger:dagger-android-processor:2.11

использование

kapt com.google.dagger:dagger-android-processor:2.11

Ответ 4

если ни одно из предложенных решений не работает, просто проверьте, что вы забыли добавить аннотации @Provides к любой из зависимостей, в моем случае это была проблема

Ответ 5

Для тех, кто интересуется, правильный ответ на эту проблему дает @Миша Акопов.

Ответ 6

У меня была та же ошибка, но проблема была с модулем (проектом), где я объявил модуль Dagger. Убедитесь, что вы добавили плагин kotlin-kapt иначе Dagger не сможет сгенерировать какой-либо класс.

// declare it at the top of your build.gradle file
apply plugin: 'kotlin-kapt'

Ответ 7

У меня была очень странная ошибка при преобразовании файла модуля в Kotlin. Это может быть редко, но, может быть, кто-то еще сталкивается с той же проблемой:

Мой модуль Dagger является частью модуля Gradle. Он использует зависимости, которые имеют только конфигурацию api Gradle. Dagger генерирует файлы Stub (Java) для каждого участвующего класса Kotlin. Без этих сабов все работало. С этими заглушками это дало вышеуказанную ошибку. Добавление всех отсутствующих зависимостей в модуль Gradle было для меня решением.