使用annotationProcessor而不是android-apt的Android Studio 3.0预览版(Canary 2)的Dagger 2

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

好吧,长话短说 – 我决定给Android Studio 3.0 Preview (Canary 2)一个镜头,我不能使用annotationProcessor而不是android-apt使用Dagger 2

我得到的错误消息是一个简单的消化:

 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 

不幸的是,它没有帮助。

摇篮:

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

Gradle的Android插件:

 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中引入了第一个“突破性变化”。我的猜测是,这是由于“新validation”。 坏消息是,很可能这个问题已经存在多年了。 https://github.com/google/dagger/releases/tag/dagger-2.9

检查(Sub)ComponentsScoped 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必须使用与Subcomponent不同的Scope 。 喜欢这个:

  @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" 
  2. 迁移到Dagger 2.9+Component s和Subcomponent s“singletons”使用不同的(Custom)Scope

有关详细说明,请参阅问题说明。

另外,我认为2.9的发行说明可以更明确地说明这一变化,不是吗? :/ https://github.com/google/dagger/releases/tag/dagger-2.9