2016-09-26 1 views
7

Ich habe ein seltsames Problem hier, und ich bin nicht ganz sicher, warum was ich nicht tun darf. Ich habe folgende Module bekommt:Dolch 2 Singleton-Komponente auf Singleton

@Module 
public final class AppModule { 
    private Context mContext; 

    @Provides 
    @Singleton 
    @AppContext 
    public Context provideContext() { return mContext; } 
} 

@Module 
public final class NetModule { 
    @Provides 
    @Singleton 
    public OkHttpClient provideOkHttp() { 
    return new OkHttpClient.Builder().build(); 
    } 
} 

Aus verschiedenen Gründen, ich habe nicht diese beiden Module in der gleichen Komponente haben will (im Wesentlichen aufgrund meiner Projektstruktur). Also habe ich versucht die folgenden Komponenten zu erstellen:

@Singleton 
@Component(modules = AppModule.class) 
public interface AppComponent { 
    @AppContext Context appContext(); 
} 

@Singleton 
@Component(dependencies = AppComponent.class, modules = NetModule.class) 
public interface NetComponent { 
    Retrofit retrofit(); 
} 

Aber wenn ich versuche, dies zu kompilieren, erhalte ich die folgende Fehlermeldung:

Error:(12, 1) error: This @Singleton component cannot depend on scoped components: @Singleton com.myapp.service.dagger.AppComponent

Ich verstehe, warum auf verschiedenen Bereiche je würde sei schlecht und nicht erlaubt. Aber warum ist Singleton abhängig - Singleton nicht erlaubt? Das fühlt sich an, als ob es funktionieren sollte, da ich nur Geschwisterkomponenten deklariere. Was vermisse ich?

Antwort

12

Da Ihre NetComponent-Komponente von Ihrer AppComponent-Komponente abhängt, können sie nicht denselben Geltungsbereich haben. Bereiche werden verwendet, um Lebenszyklen zu kommentieren, und da NetComponent von AppComponent abhängig ist, haben sie nicht den gleichen Lebenszyklus. AppComponent könnte möglicherweise länger leben als NetComponent, da es Teil des eigentlichen Build-Prozesses von NetComponent ist. NetComponent könnte ohne AppComponent nicht existieren, aber nicht umgekehrt.

Sie könnten Ihren eigenen benutzerdefinierten Bereich hinzufügen und diesen auf Ihre NetComponent und NetModule anwenden, die das Problem beheben würden.

+1

Hmm, ich sehe - das macht Sinn. Aber um die offensichtliche Folgefrage zu stellen, nehme ich an, dass diese Einschränkung dann auch für alle zusätzlichen benutzerdefinierten Bereiche gilt, oder? Wenn ich einen "PerApplication" Bereich gemacht habe, könnte ich das auf NetComponent/Module anwenden und in Ordnung sein. Aber wenn ich eine andere Komponente bauen wollte, die von NetComponent abhängig war, brauchte ich noch einen weiteren Bereich (weil der Lebenszyklus wieder ein wenig anders sein könnte). Ist das korrekt? – tmtrademark

+0

Ja, das ist richtig. – ootinii