Dagger 2组件未生成。

71
在我的模块中,在我的基础Application类中。
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'

在项目的 build.gradle 中,

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

我已经构建/重建/清理/重启项目。我有一个组件类(Component class),在其中注入对象,以及一个模块类(ModuleClass),用于提供要注入的对象。

导致Dagger Component .class未能生成的原因是什么?

编辑:

这是我的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);

}

将您的组件和模块添加到问题中。 - Pär Nils Amsen
@EpicPandaForce,我已经删除了 - 没有效果! - ghita
1
在这种情况下,您应该检查编译器的消息,看看是否有其他失败的内容。 - EpicPandaForce
1
@EpicPandaForce, 错误:(25,21)错误:找不到符号变量DaggerClassComponent 错误:执行任务“:sdk:compileReleaseJavaWithJavac”失败。
编译失败;有关详细信息,请参见编译器错误输出。
- ghita
在此之前或之后需要添加一些内容。或者你的导入语句缺失。 - EpicPandaForce
显示剩余3条评论
18个回答

139

在开发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'

45

更新(2020年3月29日)

在你的应用级别 build.gradle 文件中的 dependencies 块内,添加以下行:

     //dagger2
     api 'com.google.dagger:dagger:2.24'
     api 'com.google.dagger:dagger-android:2.24'
     api 'com.google.dagger:dagger-android-support:2.24'

     annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
     kapt 'com.google.dagger:dagger-compiler:2.24'

     annotationProcessor 'com.google.dagger:dagger-android-processor:2.24'
     kapt 'com.google.dagger:dagger-android-processor:2.24'

     compileOnly 'javax.annotation:jsr250-api:1.0'
     implementation 'javax.inject:javax.inject:1'

应用级别build.gradle文件的android块内部,

kapt {
        generateStubs = true
    }

在应用程序级别的 build.gradle 文件的顶部,请按照以下确切的顺序执行以下步骤。

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'

最后,您需要按照下面屏幕截图中提供的方式配置注释处理。您可以在菜单 文件 > 其他设置 > 新项目设置 中搜索 "注释处理器" 来完成这一步。

enter image description here

完成上述操作后,从菜单栏选择 构建 > 重建 即可完成!

测试:

@Component
public interface ApplicationComponent {

}

现在,你可以使用在编译时生成的 DaggerApplicationComponent 来代替你的 ApplicationComponent 接口。

public class MyApplication extends Application {

    ApplicationComponent applicationComponent = DaggerApplicationComponent.create();


}

6
在Windows上允许“注解处理器”的正确路径是文件 -> 其他设置 -> 新项目的设置...。 - peresisUser

8
也许你忘记在ModuleClass上注释@Module了吗?

5
如果您在AndroidStudio中有多个模块(指的是Android Studio中的模块,而不是Dagger),失败的另一个可能原因是您忘记将注解处理器放入所有模块的build.gradle文件中。我们将应用程序分成了几个模块,从使用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'

3

如果你是在2022年使用Android Studio进行这项工作,如果你只想使用一些 Dagger功能,你只需要在Gradle依赖中添加以下内容:

implementation 'com.google.dagger:dagger:2.41'
kapt 'com.google.dagger:dagger-compiler:2.41'

然后在您的插件中进行以下操作:

id 'kotlin-kapt'

你不需要添加其他任何内容。

现在这是关键步骤:你需要执行清理操作(可以在Gradle中执行,或者在“构建”菜单下选择“清理项目”),因为由于某种原因增量编译会妨碍此过程。

接着重新构建你的项目。

如果你正确创建了Dagger组件,你应该能够在此时看到编译错误;或者,如果你正确创建了组件,则代码编辑器中的自动完成功能现在应该能够使用你的组件。


清理项目。这对我有用。 - micdev

3
在 build.gradle 的 app 模块中,您需要添加必要的依赖项以使 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'

你应该更改正在使用的Dagger版本。

参考完整的Dagger文档,请访问此处


3
如果Dagger2无法生成其组件,则意味着您的代码在作用域/模块方面存在一些错误。检查 @Provides/Inject 方法。
更新:
应将组件注入到需要模块提供类实例的情况中,例如:
inject(MainActivity main);

1
@hackingforgirls 空注入(拦截器 o); 空注入(OkHttpClient o); 空注入(Retrofit o); 空注入(WebServiceCall o); 它的作用是什么? - Anton Kazakov
@hackingforgirls,你应该将你的组件注入到你想要模块实例注入的类中。 - Anton Kazakov
@AntonKazakov 它被用于将这些对象暴露给可能需要它们作为依赖项的人。 - Hohenheim
@Hohenhiem 模块类可以实现它,但不是组件。 - Anton Kazakov
1
@AntonKazakov @Provides 用于模块内部,但如果您想将一个对象暴露给另一个组件,那么就需要声明接口方法来暴露该对象。 - Hohenheim
显示剩余2条评论

2
如果您正在使用Kotlin,请确保在构建脚本中添加(Kotlin注释处理器)Gradle插件,并使用 Gradle依赖项类型,而不是用于Dagger编译器。"最初的回答"
apply plugin: 'kotlin-kapt

kapt deps.daggercompiler
implementation deps.dagger

2
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'

2

你的代码中有一些小的误解/错误,这里是一个可行的实现:

Application.java:

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

生成的类将被命名为DaggerComponentClass,而不是DaggerCompClassComponent。如果您无法在Android Studio中运行应用程序进行构建,请尝试在菜单中选择“Build->Clean project”和“Build->Rebuild project”。如果一切正常,Dagger将编译DaggerComponentClass,它将位于与ComponentClass相同的包中。
@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...
}

模块在您的代码中是正确的,请确保已经加上了注释。


我从ComponentClass中移除了@Singleton,因为它只是与模块相关的注释。嗯,不是这样吗? - EpicPandaForce
EpicPandaForce 可能是一个错误的假设,但从我在文档中看到的内容来看,@Singleton 在组件中没有被使用。 - Pär Nils Amsen
现在你让我有些不确定了,但我认为在组件上应用作用域会使它成为“作用域组件”,这将使它看到所有带有@Inject构造函数的@Singleton注释类,并且在很多例子中你可以在这里找到它们https://dev59.com/F1kR5IYBdhLWcg3w2wp1#40751767 但也许我们都错了,哈哈。 - EpicPandaForce
1
我在那部分加了删除线!我在Dagger2的官方文档https://google.github.io/dagger/subcomponents.html中发现了在组件中使用`@Singleton`的用法,所以我猜你是对的;) - Pär Nils Amsen
@Singleton只是Dagger2的作用域,但它是预定义的。作用域定义了组件及其模块的生命周期。 - Anton Kazakov
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接