2017-02-27 5 views
0

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!

Antwort

0

Ich habe festgestellt, dass Sie Teilkomponenten in AristrocratsModule nicht festgelegt haben.

Dies:

@Module public class AristocratsAppModule { 

in diese:

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

Versuchen Sie, die folgenden Änderungen vorzunehmen. In Ihrer StreamComponent erstellen Sie einen Builder.

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

    StreamComponent build(); 
} 

Schließlich werden Sie alles über StreamComponent werden injizieren, und es wird auch alles in AristocratsAppComponent injizieren.

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

Plus Sache kann danach entfernt werden.

+0

Ich habe versucht, aber der Fehler ist gleich. Es hat es nicht entfernt. – Val

Verwandte Themen