使用annotationProcessor而不是android-apt的Dagger 2与Android Studio 3.0 Preview(Canary 2)

时间:2017-05-31 10:22:53

标签: android dagger-2 android-studio-3.0 annotation-processor 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#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'

现在我收到有关范围冲突的错误... 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)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);
    }

1 个答案:

答案 0 :(得分:-4)

  1. 不要成为“聪明人”并坚持文档所说的内容:

    implementation "com.google.dagger:dagger:2.11"
    annotationProcessor "com.google.dagger:dagger-compiler:2.11"
    
  2. 迁移到Dagger 2.9+时,对(Custom)ScopeComponent s“单身人士”使用不同的Subcomponent

  3. 请参阅问题的描述以获得更详细的解释。

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