【问题标题】:Dagger 2 component not generated未生成 Dagger 2 组件
【发布时间】:2017-10-01 01:49:08
【问题描述】:

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

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 类和一个提供要注入的对象的 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);

}

【问题讨论】:

  • 将您的组件和模块添加到问题中
  • 那些void inject(...)的方法都错了,把4个都去掉
  • @EpicPandaForce ,我已删除 - 无效!
  • 在这种情况下,您应该检查编译器的消息,看看是否还有其他失败的地方。
  • @EpicPandaForce , 错误:(25, 21) 错误: 找不到符号变量 DaggerClassComponent 错误: 任务':sdk:compileReleaseJavaWithJavac' 执行失败。 > 编译失败;有关详细信息,请参阅编译器错误输出。

标签: android dagger


【解决方案1】:

我通过编辑我的匕首依赖项解决了这个问题:

 implementation "com.google.dagger:dagger:${versions.dagger}"
 kapt "com.google.dagger:dagger-compiler:${versions.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'
    

    【讨论】:

      【解决方案3】:

      更新(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'
      

      在应用级的android块内build.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>search"Annotation processor"

      之后,从菜单Build > Rebuild 执行。你完成了!

      测试:

      @Component
      public interface ApplicationComponent {
      
      }
      

      现在,您可以使用在编译时为您的 ApplicationComponent 接口生成的DaggerApplicationComponent。

      public class MyApplication extends Application {
      
          ApplicationComponent applicationComponent = DaggerApplicationComponent.create();
      
      
      }
      

      【讨论】:

      • 在 Windows 上允许“注释处理器”的正确路径是文件 -> 其他设置 -> 新项目的设置...
      【解决方案4】:

      在我的情况下,它不是仅在仪器测试中创建的,因为我错过了

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

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

      【讨论】:

        【解决方案5】:

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

        apply plugin: 'kotlin-kapt
        
        kapt deps.daggercompiler
        implementation deps.dagger
        

        【讨论】:

          【解决方案6】:

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

          你应该改变你正在使用的匕首版本。

          参考this中的完整匕首文档

          【讨论】:

            【解决方案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'
            

            【讨论】:

            • 请完整解释您的答案,以及它对这个问题的其他答案的贡献。
            【解决方案8】:

            如果您的 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'
            

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                Application.java:

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

                生成的类将命名为DaggerComponentClass,而不是DaggerCompClassComponent。如果您无法在 Android Studio 中运行您的应用来构建它,请尝试菜单中的 Build->Clean project 和 Build->Rebuild project。如果一切正常,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...
                }
                

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

                【讨论】:

                • I removed @Singleton from ComponentClass since it's an annotation that is only relevant for modules. 嗯,不是吗?
                • EpicPandaForce 可能是一个错误的假设,但从我在文档中看到的情况来看,@Singleton 没有在组件中使用
                • 现在你实际上让我不确定,但我认为在组件上应用范围使其成为“范围组件”,这将使它看到所有带有 @Inject 构造函数的 @Singleton 注释类,并且你可以在这里找到很多例子stackoverflow.com/a/40751767/2413303,但也许我们都错了,哈哈
                • 我在那部分添加了删除线!我在 Dagger2 google.github.io/dagger/subcomponents.html 的 new 官方文档中的组件中发现了 @Singleton 的用法,所以猜你是对的 ;)
                • @PärNilsAmsen 我不明白你建议的改变是什么。我要修改什么?
                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

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

                  UPD:

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

                  喜欢

                  inject(MainActivity main);
                  

                  【讨论】:

                  • @hackingforgirls 无效注入(拦截器 o);无效注入(OkHttpClient o);无效注入(改造o);无效注入(WebServiceCall o);这有什么意义?
                  • @hackingforgirls 你应该将你的组件注入到你想要注入模块实例的类中
                  • 我已经在我的项目中注入了我需要的依赖。我为什么要删除它们?
                  • @hackingforgirls 正如我所说的 void injection(Interceptor o);无效注入(OkHttpClient o);无效注入(改造o);无效注入(WebServiceCall o);是完全错误的,根本没有意义。阅读一些教程如何使用 Dagger 2
                  • @AntonKazakov @Provides 在模块内部使用,但是如果你想将一个对象暴露给另一个组件,那就是你声明暴露该对象的接口方法的时候。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-01-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多