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
тогда Subcomponent
s. Как это:
@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 ответ
Не будьте "умником" и придерживайтесь того, что говорят документы:
implementation "com.google.dagger:dagger:2.11" annotationProcessor "com.google.dagger:dagger-compiler:2.11"
При миграции на
Dagger 2.9+
использовать разные(Custom)Scope
с дляComponent
с иSubcomponent
с "синглтоны".
См. Описание вопроса для более подробного объяснения.
Кроме того, я думаю, что Примечания к выпуску для 2.9
может быть более явным об этом изменении, нет?: / https://github.com/google/dagger/releases/tag/dagger-2.9