2017-05-03 56 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