2017-05-03 61 views
7

以我模块,在我的基类的应用匕首2成分不产生

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' 

我已经做了构建/重建/清洁/重新启动项目。我有一个组件类,其中我注入对象和一个ModuleClass,在其中提供注入对象。

什么可能导致不生成Dagger组件。上课?

编辑:

这是我ModuleClass,与@Module adnotated:

@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

添加您的组件和模块的问题 –

+0

那些'无效注射(...)'方法都是错误的,删除其中所有4 – EpicPandaForce

+0

@EpicPandaForce,我已经删除了 - 没有效果! – hackingforgirls

回答

0

如果Dagger2不能产生它的组件就意味着您的代码与Scopes/Modules有一些错误。检查我们的@提供/注入方法。

UPD:

你应该注入你的组件在你需要通过模块提供的类的实例的情况。

inject(MainActivity main); 
+1

@hackingforgirls void inject(Interceptor o); void inject(OkHttpClient o); void inject(Retrofit o); void inject(WebServiceCall o);它有什么意义呢? –

+0

@hackingforgirls你应该注入你的组件到你想要注入模块实例的类中 –

+0

我已经在我的项目中注入了我需要的依赖项。我为什么要删除它们? – hackingforgirls

3

也许你忘了标注ModuleClass与@Module?

1

有上面代码中一些小的误解/故障,这里的工作实现:

Application.java:

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

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

模块在你的代码是正确的,请确保它的注解。

+0

'我从ComponentClass中删除了@Singleton,因为它是一个只与模块相关的注释。'呃,不是? – EpicPandaForce

+0

EpicPandaForce可能是一个错误的假设,但从我在文档中看到的@Singleton现在不在组件 –

+0

中使用,现在你实际上使我不确定,但我认为在组件上应用范围使其成为“作用域组件“这将使它看到'@Inject'构造函数的所有'@ Singleton'注解类,它有很多例子,你可以在这里找到拖延http://stackoverflow.com/a/40751767/2413303但也许我们全部都是错的,哈哈 – EpicPandaForce