ダガー2のセットアップを開始しましたが、バグのような奇妙な問題に直面しました。オブジェクトは@アノテーション付きのメソッドなしでは提供できません
私は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