Dagger 2 с Android Studio 3.0 Preview (Canary 2) с использованием annotationProcessor вместо android-apt

"A long time ago in a galaxy far, far away...."

Хорошо, короче говоря - я решил дать Android Studio 3.0 Preview (Canary 2) выстрел, и я не могу заставить его работать с Dagger 2 с помощью annotationProcessor вместо android-apt,

Я получаю сообщение об ошибке, которое легко переварить:

Error:(59, 24) error: cannot find symbol variable DaggerAppComponent

Я прочитал документы (думаю, ничего особенного): https://developer.android.com/studio/preview/features/new-android-plugin-migration.html

И изменил build.gradle подать в:

implementation "com.google.dagger:dagger:$rootProject.ext.daggerVersion"
annotationProcessor "com.google.dagger:dagger-android-processor:$rootProject.ext.daggerVersion"

куда daggerVersion = '2.11'

Кроме того, я убедился, что соответствующие опции отмечены в Android Studio (по умолчанию они не проверялись):

File -> Other Settings -> Default Settings -> 
Build, Execution, Deployment -> Compiler -> Annotation Processors -> 
Enable annotation processors -> IS CHECKED

К сожалению, это не помогает.

Gradle:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-milestone-1-all.zip

Плагин Android для Gradle:

dependencies {
    classpath 'com.android.tools.build:gradle:3.0.0-alpha2'
    ...
}

Как мне заставить это работать с annotationProcessor вместо android-apt?

РЕДАКТИРОВАТЬ #1

Я добавил эти "предполагаемые дополнительные" зависимости "на всякий случай"

implementation "com.google.dagger:dagger:$rootProject.ext.daggerVersion"
implementation "com.google.dagger:dagger-android:$rootProject.ext.daggerVersion"
implementation "com.google.dagger:dagger-android-support:$rootProject.ext.daggerVersion"
annotationProcessor "com.google.dagger:dagger-android-processor:$rootProject.ext.daggerVersion"
annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.ext.daggerVersion"
compileOnly 'javax.annotation:jsr250-api:1.0'

И теперь я получаю ошибку о конфликтующих областях... Оо

SomeSubComponent has conflicting scopes:
AppComponent also has @Singleton

Я обновил Dagger от 2.6.1 в 2.11поэтому теперь я ищу некоторые "критические изменения" в заметках о выпуске: https://github.com/google/dagger/releases

Редактировать № 2

Хорошей новостью является то, что первое "прорывное изменение" было введено в 2.9 Мое дикое предположение, что это из-за "новой проверки". Плохая новость заключается в том, что, скорее всего, проблема существовала уже целую вечность. https://github.com/google/dagger/releases/tag/dagger-2.9

Пересматривая структуру (Sub)Components а также Scoped Dependencies,

Правка № 3

В настоящее время эта проблема связана с этой: https://github.com/google/dagger/issues/107

Рассмотрим следующий пример:

@Singleton
@Component(modules = {
        AppModule.class
})
public interface AppComponent {
    SomeComponent plus(SomeModule someModule);
}

@Module
public class AppModule {

    @Provides
    @Singleton
    public Integer provideInteger() {
        return 1;
    }
}

@Singleton
@Subcomponent(modules = {
        SomeModule.class
})
public interface SomeComponent {
    void inject(MainActivity activity);
}

@Module
public class SomeModule {

    @Provides
    @Singleton
    public String provideText(Integer number) {
        return number.toString();
    }
}

Это больше невозможно с Dagger 2.9+, Component должен использовать другой Scope тогда Subcomponents. Как это:

    @Scope
    public @interface ApplicationScope {
    }

    @Module
    public class AppModule {

        @Provides
        @ApplicationScope
        public Integer provideInteger() {
            return -1;
        }
    }

    @ApplicationScope
    @Component(modules = {
            AppModule.class
    })
    public interface AppComponent {
        SomeComponent plus(SomeModule someModule);
    }

1 ответ

  1. Не будьте "умником" и придерживайтесь того, что говорят документы:

    implementation "com.google.dagger:dagger:2.11"
    annotationProcessor "com.google.dagger:dagger-compiler:2.11"
    
  2. При миграции на Dagger 2.9+ использовать разные (Custom)Scopeс для Componentс и Subcomponentс "синглтоны".

См. Описание вопроса для более подробного объяснения.

Кроме того, я думаю, что Примечания к выпуску для 2.9 может быть более явным об этом изменении, нет?: / https://github.com/google/dagger/releases/tag/dagger-2.9

Другие вопросы по тегам