未生成Dagger 2组件

时间:2017-05-03 09:43:10

标签: android dagger

在我的模块中,在我的基础应用程序类

component = DaggerCompClassComponent.builder()
                .classModule(new ModuleClass()).build();

找不到DaggerCompClassComponent。

我有模块build.gradle

apply plugin: 'com.neenbedankt.android-apt'
.........................
apt 'com.google.dagger:dagger-compiler:2.8'
compile 'com.google.dagger:dagger:2.8'
provided 'javax.annotation:jsr250-api:1.0'

并在Project build.gradle中,

 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

我完成了build / rebuild / clean / restart项目。我有一个Component类,我在其中注入对象和一个ModuleClass,我提供了要注入的对象。

不生成Dagger组件的原因可能是什么。上课?

编辑:

这是我的ModuleClass,注释了@Module:

@Provides
@Singleton
public Interceptor provideInterceptor() {
    return new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request.Builder builder = chain.request().newBuilder();

            builder.addHeader("AppName-Android", BuildConfig.VERSION_NAME + "-" + BuildConfig.VERSION_CODE)
                    .addHeader("Content-Type", "application/json");

            return chain.proceed(builder.build());
        }
    };
}

@Provides
@Singleton
OkHttpClient provideOkHttpClient(Interceptor interceptor) {
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.interceptors().add(interceptor);
    return builder.build();
}

@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient client) {
    return new Retrofit.Builder()
            .baseUrl(BaseApplication.getRes().getString(R.string.api_base_url))
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();
}

@Provides
@Singleton
WebServiceCall provideWebService(Retrofit retrofit) {
    return retrofit.create(WebServiceCall.class);
}

这是我的组件类:

@Component(modules = ModuleClass.class)
@Singleton
public interface ComponentClass {

    void inject(Interceptor o);
    void inject(OkHttpClient o);
    void inject(Retrofit o);
    void inject(WebServiceCall o);

}

12 个答案:

答案 0 :(得分:56)

在Kotlin上进行开发时,您应该在annotationProcessor对应的旁边添加以下行:

kapt 'com.google.dagger:dagger-android-processor:2.15'
kapt 'com.google.dagger:dagger-compiler:2.15'

并在同一文件的开头添加apply plugin: 'kotlin-kapt'

该部分对我来说是这样的:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt' // <- Add this line
apply plugin: 'io.fabric'

答案 1 :(得分:23)

这是新Dagger项目的解决方案。

这两行负责在Dagger 2中生成编译时框架。

compile 'com.google.dagger:dagger:2.14.1' //在编译时生成框架 annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1' //根据您提供的注释在编译时生成框架。

完全设置Dagger

        //dagger 2
        compile 'com.google.dagger:dagger:2.14.1'
        annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'

        //to enable DaggerActivity, DaggerBroadcastReceiver, DaggerFragment etc classes
        compile 'com.google.dagger:dagger-android:2.14.1'
        annotationProcessor 'com.google.dagger:dagger-android-processor:2.14.1'

        //support libraries with dagger 2
        compile 'com.google.dagger:dagger-android-support:2.14.1'

注意:您需要按照以下屏幕截图中的说明配置注释流程。您可以执行此操作File>Other Settings>Default Settings>搜索"Annotation processor" enter image description here

答案 2 :(得分:6)

也许您忘了使用@Module注释ModuleClass?

答案 3 :(得分:3)

上面的代码中存在一些小的误解/错误,这是一个有效的实现:

<强> Application.java:

component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();

生成的类名为DaggerComponentClass,而不是DaggerCompClassComponent。如果您无法在Android Studio中运行应用程序来构建它,请尝试在菜单中使用Build-&gt; Clean project和Build-&gt; Rebuild项目。如果一切正常,Dagger将编译DaggerComponentClass,它将与ComponentClass位于同一个包中。

<强> ComponentClass.java:

@Component(modules = ModuleClass.class)
public interface ComponentClass {
    void inject(AClassThatShouldGetInstancesInjected instance);
}

Dagger2中的一个组件有一个名为inject的方法,它接收实例以将实例注入其中,而不是相反。在上面的代码中,类AClassThatShouldGetInstancesInjected通常会调用componentClass.inject(this);来为实例注入实例。

<强> ModuleClass.java:

@Module
public class ModuleClass {
    @Provides
    @Singleton
    public Interceptor provideInterceptor() {/*code*/}

    //Your Providers...
}

模块在您的代码中是正确的,请确保其注释。

答案 4 :(得分:2)

如果您的AndroidStudio中有多个模块(就Android Studio而言,不是Dagger,则为模块),另一个失败的可能原因是您忘记将注释处理器放入所有模块的build.gradle中。 / p>

我们将应用程序划分为多个模块,将依赖关系从使用implementation更改为使用api,但忘记了相应地处理注释处理器。

因此,您只能在根模块中使用以下行:

api 'com.google.dagger:dagger-android:2.16'
// if you use the support libraries
api 'com.google.dagger:dagger-android-support:2.16'

但是应该在所有模块依赖项中指定这些:

annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
// if you use injections to Android classes
annotationProcessor 'com.google.dagger:dagger-android-processor:2.16'

答案 5 :(得分:2)

在build.gradle的应用中,您需要为Dagger添加必要的依赖项以生成相应的类,如下所示:

  implementation 'com.google.dagger:dagger-android:2.21'
  implementation 'com.google.dagger:dagger-android-support:2.21' // if you use the support libraries
  annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
  annotationProcessor 'com.google.dagger:dagger-compiler:2.21'

您应该更改使用的匕首版本。

请参阅this

中的完整匕首文档

答案 6 :(得分:2)

如果您使用的是Kotlin,请确保将kapt(Kotlin注释处理器)Gradle插件添加到您的构建脚本中,并使用kapt的Gradle依赖类型而不是annotationProcessor作为Dagger Compiler。

apply plugin: 'kotlin-kapt

kapt deps.daggercompiler
implementation deps.dagger

答案 7 :(得分:0)

如果Dagger2无法生成其组件,则意味着您的代码在Scopes / Modules中存在一些错误。检查我们的@ Provide / Inject方法。

<强> UPD:

您应该将组件注入需要模块提供的类实例的情况。

喜欢

inject(MainActivity main);

答案 8 :(得分:0)

//add all the dependencies otherwise component class will not be generated.
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'

答案 9 :(得分:0)

就我而言,它并不是仅在Instrumentation Testing中创建的,因为我丢失了

kaptAndroidTest "com.google.dagger:dagger-compiler:$rootProject.daggerVersion"

我当然使用的是Kotlin,$rootProject.daggerVersion是我的基本构建文件中的一个属性。您可以替换所需的任何版本或gradle依赖项,并丢失它们。

答案 10 :(得分:0)

api 'com.google.dagger:dagger-android:2.28.3'
api 'com.google.dagger:dagger-android-support:2.28.3'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.28.3'

如果在应用程序级别相关性中使用过,则将以上相关性替换为以下相关性

api 'com.google.dagger:dagger:2.28.3'
annotationProcessor 'com.google.dagger:dagger-compiler:2.28.3'

答案 11 :(得分:0)

我通过编辑对此的匕首依赖性来解决它:

 implementation "com.google.dagger:dagger:${versions.dagger}"
 kapt "com.google.dagger:dagger-compiler:${versions.dagger}"