Ich habe damit begonnen, Dolch 2 einzurichten und habe ein seltsames Problem, das für mich wie ein Fehler aussieht.Objekte können nicht ohne eine @ Provide-Annotated-Methode bereitgestellt werden
Ich habe 1 Hauptkomponente und 1 Unterkomponente, die ich 'Plus' in der Elternkomponente.
Ich benutze:
compile "com.google.dagger:dagger:2.4"
apt "com.google.dagger:dagger-compiler:2.4"
annotationProcessor "com.google.dagger:dagger-compiler:2.4"
Anwendungskomponente prety einfach ist. Es ist einfach 'plus' die Subkomponente:
@Singleton @Component(modules = { AristocratsAppModule.class })
public interface AristocratsAppComponent {
StreamComponent plus(StreamModule module);
}
Anwendungsmodul auch recht einfach. Es bietet Anwendungsebene Abhängigkeiten:
@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 ...
}
}
Subkomponente hat zwei StreamServices (Retrofit-Dienste) und einfache inject:
@PerController @Subcomponent(modules = { StreamModule.class }) public interface StreamComponent {
void inject(StreamsController streamsController);
AristocratsStreamService providesAristocratsStreamService();
LastFmStreamService providesLastFmStreamService();
}
Module von Subkomponente Moderator Injektion und zwei verschiedene Injektionen von Retrofit-Service anbieten:
@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);
}
}
Applikat Ioneninjektion, die ich in onCreate() meiner App-Klasse aufrufen:
mAppComponent = DaggerAristocratsAppComponent.builder()
.aristocratsAppModule(new AristocratsAppModule(this))
.build();
Ansicht Injektion, die ich in meinem Controller nennen:
getAppComponent().plus(new StreamModule(this)).inject(this);
Ausnahme, dass ich während des Build bekommen:
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
Fehler Beschwerden über fehlende @Provides-annotated method
, aber sie sind in meinem Kind-Modul. Scheint, dass Dagger2 sie einfach nicht sieht. Ich dachte, dass das Problem in der fehlenden Deklaration der AristocratsStreamService
Subkomponente sein könnte, also habe ich es dort sogar hinzugefügt, aber nichts geändert.
Diese Situation sieht sehr merkwürdig aus und ich würde gerne etwas von erfahreneren Dagger2-Entwicklern hören.
Vielen Dank im Voraus!
Ich habe versucht, aber der Fehler ist gleich. Es hat es nicht entfernt. – Val