未生成 Dagger 2 组件

Dagger 2 component not generated

提问人:ghita 提问时间:5/3/2017 最后编辑:ghita 更新时间:9/9/2023 访问量:63834

问:

在我的模块中,在我的基本 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'

在 Project build.gradle 中,

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

我已经完成了构建/重建/清理/重启项目。我有一个 Component 类,用于注入对象,还有一个 ModuleClass,用于提供要注入的对象。

不生成匕首组件的原因是什么。类?

编辑:

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

}
安卓 匕首

评论

0赞 Pär Nils Amsen 5/3/2017
将您的组件和模块添加到问题中
0赞 EpicPandaForce 5/3/2017
这些方法都是错误的,删除所有 4 个void inject(...)
0赞 ghita 5/3/2017
@EpicPandaForce,我已经删除了 - 没有效果!
1赞 EpicPandaForce 5/3/2017
在这种情况下,您应该检查编译器的消息,看看是否有其他失败的内容。
1赞 ghita 5/3/2017
@EpicPandaForce,错误:(25, 21) 错误:找不到符号变量 DaggerClassComponent 错误:任务“:sdk:compileReleaseJavaWithJavac”执行失败。> 编译失败;有关详细信息,请参阅编译器错误输出。

答:

3赞 Anton Kazakov 5/3/2017 #1

如果 Dagger2 无法生成其组件,则意味着您的代码在作用域/模块方面存在一些错误。检查我们的 @Provides/注入方法。

更新:

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

喜欢

inject(MainActivity main);

评论

1赞 Anton Kazakov 5/3/2017
@hackingforgirls void inject(拦截器o);void 注入 (OkHttpClient o);空隙注入(Retrofit o);void 注入(WebServiceCall o);这有什么意义?
0赞 Anton Kazakov 5/3/2017
@hackingforgirls,您应该将组件注入到要注入模块实例的类中
0赞 ghita 5/3/2017
我已经在我的项目中注入了我需要的依赖项。我为什么要删除它们?
0赞 Anton Kazakov 5/3/2017
@hackingforgirls正如我所说,void inject(Interceptor o);void 注入 (OkHttpClient o);空隙注入(Retrofit o);void 注入(WebServiceCall o);是完全错误的,根本没有意义。阅读一些如何使用 Dagger 2 的教程
1赞 Hohenheim 10/3/2017
@AntonKazakov在模块内部使用,但如果要向另一个组件公开一个对象,则需要声明公开该对象的接口方法。@Provides
8赞 Alex Shutov 5/3/2017 #2

也许你忘了用@Module注释 ModuleClass ?

2赞 Pär Nils Amsen 5/3/2017 #3

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

应用.java:

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

生成的类将被命名为 ,而不是 。如果您无法在 Android Studio 中运行应用来构建应用,请尝试菜单中的 Build->Clean 项目和 Build->Rebuild 项目。如果一切正常,Dagger 将编译,它将位于与 相同的包中。DaggerComponentClassDaggerCompClassComponentDaggerComponentClassComponentClass

组件类:.java:

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

Dagger2 中的组件具有命名的方法,这些方法接收实例以将实例注入其中,而不是相反。在上面的代码中,该类通常会调用将实例注入到自身中。injectAClassThatShouldGetInstancesInjectedcomponentClass.inject(this);

模块类:.java:

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

    //Your Providers...
}

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

评论

0赞 EpicPandaForce 5/3/2017
I removed @Singleton from ComponentClass since it's an annotation that is only relevant for modules.嗯,不是吗?
0赞 Pär Nils Amsen 5/3/2017
EpicPandaForce 可能是一个错误的假设,但从我在文档中看到的内容来看,@Singleton Components 中没有使用
0赞 EpicPandaForce 5/3/2017
现在你实际上让我不确定,但我认为在组件上应用范围使其成为“作用域组件”,这将使它看到所有带有构造函数的带注释的类,并且在很多示例中,您可以在这里找到徘徊 stackoverflow.com/a/40751767/2413303 但也许我们都错了,哈哈@Singleton@Inject
1赞 Pär Nils Amsen 5/3/2017
我在那部分添加了删除线!我在 Dagger2 的新官方文档中发现了 in Components 的用途 google.github.io/dagger/subcomponents.html 所以猜你是对的;)@Singleton
0赞 ghita 5/3/2017
@PärNilsAmsen我不愿意;得到你建议的改变是什么。我需要修改什么?
45赞 Uddhav P. Gautam 3/27/2018 #4

更新(2020 年 3 月 29 日)

应用级 inside 块中,添加以下行:build.gradledependencies

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

应用级的内部块,androidbuild.gradle

kapt {
        generateStubs = true
    }

应用级别的顶部,按完全下面的顺序执行此操作。build.gradle

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

最后,您需要配置注释过程,如下面的屏幕截图所示。您可以进行此搜索File>Other Settings>Settings for New Projects>"Annotation processor" enter image description here

在此之后,从菜单中执行。大功告成!Build > Rebuild

测试:

@Component
public interface ApplicationComponent {

}

现在,您可以将编译时生成的 ApplicationComponent 接口用于该接口。DaggerApplicationComponent

public class MyApplication extends Application {

    ApplicationComponent applicationComponent = DaggerApplicationComponent.create();


}

评论

6赞 peresisUser 2/14/2019
在 Windows 上允许“注释处理器”的正确路径是 文件 -> 其他设置 -> 新项目的设置...
139赞 Gonzalo 4/5/2018 #5

在 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'
5赞 Gaket 7/31/2018 #6

如果你的 AndroidStudio 中有多个模块(Android Studio 中的模块,而不是 Dagger),另一个可能的失败原因是你忘记将注解处理器放入所有模块中。build.gradle

我们将应用程序划分为几个模块,将依赖项从 using 更新为 use,但忘记相应地处理注释处理器。implementationapi

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

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'
-2赞 sudhanshu 2/22/2019 #7
//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'

评论

0赞 Simon.S.A. 2/22/2019
请充分解释您的答案,以及它对这个问题的其他答案有何贡献。
3赞 Mr Special 2/25/2019 #8

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

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

请参阅此处的完整匕首文档

2赞 Javad 3/31/2019 #9

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

apply plugin: 'kotlin-kapt

kapt deps.daggercompiler
implementation deps.dagger
0赞 Chisko 5/16/2020 #10

就我而言,它不仅仅是在仪器测试中创建的,因为我错过了

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

当然,我使用的是 Kotlin,并且是我基本构建文件上的一个属性。您可以替换您想要但缺少的任何版本或 gradle 依赖项。$rootProject.daggerVersion

2赞 Manoj Behera 9/10/2020 #11
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'

如果已使用上述依赖项,请在应用级依赖项中将 above 替换为下面的依赖项

api 'com.google.dagger:dagger:2.28.3'
annotationProcessor 'com.google.dagger:dagger-compiler:2.28.3'
1赞 nima 12/14/2020 #12

我通过将我的匕首依赖项编辑为以下内容来解决它:

 implementation "com.google.dagger:dagger:${versions.dagger}"
 kapt "com.google.dagger:dagger-compiler:${versions.dagger}"
1赞 Alireza Akbari 1/24/2022 #13

因为接受的答案对我不起作用:

此问题与 Android Studio(及更高版本)有关,您可以通过执行以下步骤来解决它:V4.1.2

Pref -> Editor -> File Types -> Ignore Files And Folders -> Remove "Dagger*.java;" 另外,如果您看到其他 Dagger 正则表达式,请将它们也删除。

现在 android studio 将找到生成的组件类。

评论

0赞 Zainal Fahrudin 1/20/2023
在我的 android studio 2021.3.1 补丁 1 上不存在"Dagger*.java;"
3赞 Dexter Legaspi 4/19/2022 #14

对于 2022 年在 Android Studio 上执行此操作的任何人,如果您只想使用一些 Dagger 功能,您只需要在 Gradle 依赖项中添加以下内容:

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

然后这个在你的插件上:

id 'kotlin-kapt'

您无需添加任何其他内容。

现在这是关键的一步:您需要进行清理(在 Gradle 中或只需在 Build 菜单下选择 Clean Project),因为出于某种原因,增量编译会妨碍您。

然后重新生成项目。

如果您正确创建了 Dagger 组件,此时应该会看到编译错误,或者如果您正确创建了它们,则组件的自动完成现在应该可以在代码编辑器中工作。

评论

0赞 micdev 12/15/2022
“清洁项目”这对我有用。
0赞 Anirudh R.Huilgol. 9/7/2022 #15

试试这个对 Kotlin 有用。就这么多build.gradle (Module YourProject.app)

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'
}

dependencies {
    .....
    implementation 'com.google.dagger:dagger-android:2.35.1'
    kapt 'com.google.dagger:dagger-compiler:2.15'
    implementation 'javax.inject:javax.inject:1'
    .....
}
0赞 flamyoad 5/29/2023 #16

如果一个项目中有多个模块,则可以选择使用以下命令为一个模块生成 Dagger2 类。

./gradlew <module-name>:kaptDebugKotlin

0赞 Haris 9/9/2023 #17

我花了一个小时,因为我错误地使用了错误的导入。

import com.google.android.datatransport.runtime.dagger.Module
import com.google.android.datatransport.runtime.dagger.Provides
import com.google.android.datatransport.runtime.dagger.Component

正确的导入:

import dagger.Component
import dagger.Module
import dagger.Provides