我已經開始設置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開發人員的一些意見。
預先感謝您!
我試過但錯誤是一樣的。它沒有刪除它。 – Val