"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#annotationProcessor_config
И изменил файл 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
?
EDIT # 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'
И теперь я получаю сообщение о конфликтующих областях... Oo
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
с. Как это:
@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);
}