15
"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'

现在我得到一个关于范围冲突的错误......哦

SomeSubComponent has conflicting scopes:
AppComponent also has @Singleton

我确实将 Dagger 从升级2.6.12.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必须使用与 s 不同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);
    }
4

1 回答 1

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

    implementation "com.google.dagger:dagger:2.11"
    annotationProcessor "com.google.dagger:dagger-compiler:2.11"
    
  2. 迁移以Dagger 2.9+使用不同(Custom)ScopeComponents 和Subcomponents 时“单例”。

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

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

于 2017-06-01T14:17:23.770 回答