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)一枪,我不能使用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 

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中引入的。我的猜测是这是由于“新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必须使用不同的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); } 

Solutions Collecting From Web of "Dagger 2与Android Studio 3.0 Preview(Canary 2)使用annotationProcessor而不是android-apt"

  1. 不要成为一个“聪明人”,坚持文件说:

     implementation "com.google.dagger:dagger:2.11" annotationProcessor "com.google.dagger:dagger-compiler:2.11" 
  2. 当移植到Dagger 2.9+使用不同的(Custom)Scope作为ComponentSubcomponent “单例”。

有关更详细的解释,请参阅问题描述。

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