未生成 Dagger 2 组件

Dagger 2 component not generated

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

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

找不到 DaggerCompClass组件。

我有模块 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 组件的原因是什么。 class ?

编辑:

这是我的模块Class,用@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);
}

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

}

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

更新:

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

喜欢

inject(MainActivity main);

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

上面的代码中有一些小问题 misconceptions/faults,这是一个有效的实现:

Application.java:

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

生成的 class 将被命名为 DaggerComponentClass,而不是 DaggerCompClassComponent。如果您无法在 Android Studio 中 运行 构建您的应用程序,请尝试菜单中的构建->清理项目和构建->重建项目。如果一切正常,Dagger 将编译 DaggerComponentClass,它将位于与 ComponentClass.

相同的包中

ComponentClass.java:

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

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

ModuleClass.java:

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

    //Your Providers...
}

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

更新(2020 年 3 月 29 日)

app-level 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'

app-levelandroid 块内 build.gradle

kapt {
        generateStubs = true
    }

app-level build.gradletop,正好在 中执行此操作下单.

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"

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

测试:

@Component
public interface ApplicationComponent {

}

现在,您可以将在 compile-time 生成的 DaggerApplicationComponent 用于您的 ApplicationComponent 接口。

public class MyApplication extends Application {

    ApplicationComponent applicationComponent = DaggerApplicationComponent.create();


}

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

如果您的 AndroidStudio 中有多个模块(AndroidStudio 中的模块,而不是 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'
//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'

在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

中的完整匕首文档

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

apply plugin: 'kotlin-kapt

kapt deps.daggercompiler
implementation deps.dagger

在我的例子中,它不是仅在 Instrumentation Testing 中创建的,因为我丢失了

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

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

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'

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

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

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

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

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

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

对于 2022 年在 Android Studio 上执行此操作的任何人,如果您只想使用 一些 Dagger 功能,则只需将其添加到您的 Gradle依赖项:

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

那么在你的插件上:

id 'kotlin-kapt'

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

现在是关键步骤:您需要进行清理(在 Gradle 中或仅 select 生成菜单下的清理项目),因为出于某种原因增量编译是挡路了。

然后重建你的项目。

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