Компонент Кинжал 2 не сгенерирован

В моем модуле в моем базовом классе приложения

component = DaggerCompClassComponent.builder()
                .classModule(new ModuleClass()).build();

он не может найти DaggerCompClassComponent.

У меня есть модуль build.gradle

apply plugin: 'com.neenbedankt.android-apt'
.........................
apt 'com.google.dagger:dagger-compiler:2.8'
compile 'com.google.dagger:dagger:2.8'
provided 'javax.annotation:jsr250-api:1.0'

и в проекте build.gradle,

 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

Я выполнил проект build/rebuild/clean/restart. У меня есть класс Component, где я вставляю объекты и ModuleClass, где я предоставляю объекты для ввода.

В чем может быть причина не создавать компонент кинжала. класс?

EDIT:

Это мой ModuleClass, добавленный с @Module:

@Provides
@Singleton
public Interceptor provideInterceptor() {
    return new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request.Builder builder = chain.request().newBuilder();

            builder.addHeader("AppName-Android", BuildConfig.VERSION_NAME + "-" + BuildConfig.VERSION_CODE)
                    .addHeader("Content-Type", "application/json");

            return chain.proceed(builder.build());
        }
    };
}

@Provides
@Singleton
OkHttpClient provideOkHttpClient(Interceptor interceptor) {
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.interceptors().add(interceptor);
    return builder.build();
}

@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient client) {
    return new Retrofit.Builder()
            .baseUrl(BaseApplication.getRes().getString(R.string.api_base_url))
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();
}

@Provides
@Singleton
WebServiceCall provideWebService(Retrofit retrofit) {
    return retrofit.create(WebServiceCall.class);
}

И это мой класс компонентов:

@Component(modules = ModuleClass.class)
@Singleton
public interface ComponentClass {

    void inject(Interceptor o);
    void inject(OkHttpClient o);
    void inject(Retrofit o);
    void inject(WebServiceCall o);

}

Ответ 1

При разработке на 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'

Ответ 2

Вот решение для свежего проекта 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" enter image description here

Ответ 3

Возможно, вы забыли аннотировать модуль ClassClass с помощью @Module?

Ответ 4

В приведенном выше коде есть некоторые незначительные недоразумения/ошибки, здесь рабочая реализация:

Application.java:

component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();

Сгенерированный класс будет называться DaggerComponentClass, а не DaggerCompClassComponent. Если вы не можете запустить приложение в Android Studio, чтобы создать его, попробуйте выполнить проект Build- > Clean project и Build- > Rebuild в меню. Если все в порядке, кинжал будет скомпилирован 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...
}

Модуль правильный в вашем коде, убедитесь, что его аннотированный.

Ответ 5

Если у вас есть несколько модулей в 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'

Ответ 6

Если Dagger2 не может генерировать свои компоненты, это означает, что ваш код имеет некоторые ошибки с помощью Scopes/Modules. Проверьте наши методы @Provides/Inject.

UPD:

Вы должны вставлять свои компоненты в случаи, когда вам нужны экземпляры классов, предоставляемые модулем.

like

inject(MainActivity main);