未生成Dagger 2组件

问题描述 投票:26回答:9

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

我已经完成了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);

}
android dagger
9个回答
64
投票

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

24
投票

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

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

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

完全设置匕首

        //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>search"Annotation processor" enter image description here


6
投票

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


3
投票

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

application.Java:

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

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

component class.Java:

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

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

module class.Java:

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

    //Your Providers...
}

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


2
投票

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

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中提到完整的匕首文件


2
投票

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

apply plugin: 'kotlin-kapt

kapt deps.daggercompiler
implementation deps.dagger

1
投票

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

UPD:

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

喜欢

inject(MainActivity main);

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'
© www.soinside.com 2019 - 2024. All rights reserved.