2017-02-27 80 views
0

我已經開始設置Dagger 2並面臨一個奇怪的問題,看起來像一個bug。如果沒有@提供註釋的方法,則不能提供對象

我有1個主要組件和1個子組件,我在父組件中加'。

我用:

compile "com.google.dagger:dagger:2.4" 
apt "com.google.dagger:dagger-compiler:2.4" 
annotationProcessor "com.google.dagger:dagger-compiler:2.4" 

應用程序組件是prety容易。它只是 '加' 的子組件:

@Singleton @Component(modules = { AristocratsAppModule.class }) 
public interface AristocratsAppComponent { 
    StreamComponent plus(StreamModule module); 
} 

應用模塊也基本相當。它提供應用級的依賴關係:

@Module public class AristocratsAppModule { 
    private static AristocratsApp app; 

    public AristocratsAppModule(AristocratsApp app) { 
    AristocratsAppModule.app = app; 
    } 

    @Provides @Singleton AristocratsApp providesApplication() { 
    return app; 
    } 

    @Provides @Singleton GsonXml providesGsonXml() { 
    return ... 
    } 

    @Provides @Singleton @Named("aristocrats") Retrofit providesAristocratsRetrofit() { 
    return ... 
    } 

    @Provides @Singleton @Named("last_fm") Retrofit providesLastFmRetrofit() { 
    return ... 
    } 
} 

子組件具有兩個StreamServices(改造服務)和簡單的注射:

@PerController @Subcomponent(modules = { StreamModule.class }) public interface StreamComponent { 
    void inject(StreamsController streamsController); 

    AristocratsStreamService providesAristocratsStreamService(); 

    LastFmStreamService providesLastFmStreamService(); 
} 

副成分的模塊提供演示注射和改造服務的兩個不同的注射:

@Module public class StreamModule { 
    private StreamsController mView; 

    public StreamModule(StreamsController view) { 
    mView = view; 
    } 

    @Provides @PerController StreamMvp.Presenter providesPresenter(StreamCase streamCase, 
     StreamModelMapper streamMapper) { 
    return new StreamPresenter(mView, streamCase, streamMapper); 
    } 

    @Provides @PerController AristocratsStreamService providesAristocratsStreamService(
     @Named("aristocrats") Retrofit retrofit) { 
    return retrofit.create(AristocratsStreamService.class); 
    } 

    @Provides @PerController LastFmStreamService providesLastFmStreamService(
     @Named("last_fm") Retrofit retrofit) { 
    return retrofit.create(LastFmStreamService.class); 
    } 
} 

Applicat離子注入,我調用的onCreate()我的應用程序類:

mAppComponent = DaggerAristocratsAppComponent.builder() 
     .aristocratsAppModule(new AristocratsAppModule(this)) 
     .build(); 

觀注,我在我的控制器調用:

getAppComponent().plus(new StreamModule(this)).inject(this); 

異常生成過程中我得到:

Error:(13, 8) error: [com.qsoft.streams.presentation.di.StreamComponent.inject(com.qsoft.streams.presentation.StreamsController)] com.qsoft.streams.data.network.AristocratsStreamService cannot be provided without an @Provides-annotated method. 
com.qsoft.streams.data.network.AristocratsStreamService is injected at 
com.qsoft.streams.data.network.StreamApi.<init>(…, streamServiceAristocrats, …) 
com.qsoft.streams.data.network.StreamApi is injected at 
com.qsoft.streams.data.repository.StreamRepository.<init>(streamApi, …) 
com.qsoft.streams.data.repository.StreamRepository is injected at 
com.qsoft.streams.domain.interactors.StreamCase.<init>(streamRepository) 
com.qsoft.streams.domain.interactors.StreamCase is injected at 
com.qsoft.streams.presentation.di.StreamModule.providesPresenter(streamCase, …) 
com.qsoft.streams.presentation.StreamMvp.Presenter is injected at 
com.qsoft.streams.presentation.StreamsController.mPresenter 
com.qsoft.streams.presentation.StreamsController is injected at 
com.qsoft.streams.presentation.di.StreamComponent.inject(streamsController) 
A binding with matching key exists in component: com.qsoft.streams.presentation.di.StreamComponent 

關於丟失@Provides-annotated method的錯誤投訴,但他們在我的孩子模塊。似乎Dagger2只是看不到它們。我認爲這個問題可能在子組件AristocratsStreamService的遺漏聲明中,所以我甚至在那裏添加了它,但沒有任何變化。

這種情況看起來很奇怪,我想聽聽更多有經驗的Dagger2開發人員的一些意見。

預先感謝您!

回答

0

我注意到你沒有在AristrocratsModule中設置子組件。

此:

@Module public class AristocratsAppModule { 

到這一點:

@Module(subcomponents = {StreamComponent.class}) 
public class AristocratsAppModule { 

嘗試做如下修改。在你的StreamComponent中創建一個Builder。

@Subcomponent.Builder 
interface Builder { 
    Builder streamModule(StreamModule module); 

    StreamComponent build(); 
} 

最終,你將通過StreamComponent被注入的一切,它會在AristocratsAppComponent注入一切爲好。

public StreamComponent getStreamComponent(Controller controller) { 
    return getAppComponent().streamBuilder().streamModule(new StreamModule(controller)).build(); 
} 

加東西可以在此之後被刪除。

+0

我試過但錯誤是一樣的。它沒有刪除它。 – Val