2015-05-23 9 views
9

Questo è quello che ho attualmente e funziona:componente Dagger2 con più di un dipendenze

@FragmentScope 
@Component(dependencies = {FacebookComponent.class}, 
      modules = {FragmentFacebookLoginModule.class}) 
public interface FragmentFacebookLoginComponent { 

    void inject(FragmentFacebookLogin fragment); 
} 

Ora voglio aggiungere un'altra dipendenza. Ho cambiato in questo:

@Component(dependencies = {FacebookComponent.class, AnotherComponent.class}, 
      modules = {FragmentFacebookLoginModule.class}) 

Ma ora ottengo questo messaggio di errore:

FragmentFacebookLoginComponent dipende da più di un scope componente

Come posso risolvere questo problema? Come posso avere più di una dipendenza?

Se rimuovo la portata da un componente ricevo questo messaggio di errore:

AnotherComponent (senza ambito) non può dipendere da componenti con ambito

risposta

4

ho trovato la risposta qui: https://stackoverflow.com/a/29619594/1016472

Alla fine ho creato un AppComponent con l'ambito giusto e permesso a FacebookComponent e AnotherComponent di estendere questo AppComponent.

FacebookComponent e AnotherComponent non hanno il proprio ambito (l'ho rimosso).

ora sembra in questo modo:

@AppScope 
@Component 
public interface AppComponent { 

} 


@Component(modules = {FacebookModule.class}) 
public interface FacebookComponent extends AppComponent { 

} 


@Component(modules = {AnotherModule.class}) 
public interface AnotherComponent extends AppComponent { 

} 


@FragmentScope 
@Component(dependencies = {FacebookComponent.class, AnotherComponent.class}, 
      modules = {FragmentFacebookLoginModule.class}) 
public interface FragmentFacebookLoginComponent { 

    void inject(FragmentFacebookLogin fragment); 
} 
+0

It ** ** opere davvero? Mi sembra un po 'strano. FacebookModule e AnotherModule forniscono oggetti con ambito @AppScope? – afj88

+0

@ afj88 Non so se funzionerà oggi ma ha funzionato 2 anni fa –

+3

confermato, non funziona più per 'dagger-2.10' – Leo

2

Che cosa si vuole essere determinato a essere all'interno della ApplicationScope dovrebbero essere tutti definiti senza un campo di applicazione, e collegati tra loro sotto il campo di applicazione solo nel ApplicationComponent sotto la data di applicazione .

Per esempio,

@Component(modules = {FacebookModule.class}) 
public interface FacebookComponent { 
    FacebookThing facebookThing(); //assuming this is with @Provides in FacebookModule with NO SCOPE 
} 


@Component(modules = {AnotherModule.class}) 
public interface AnotherComponent{ 
    AnotherThing anotherThing(); //assuming this is with @Provides in AnotherModule with NO SCOPE 
} 

allora si può fare

@AppScope 
@Component(dependencies={AnotherComponent.class, FacebookComponent.class}) 
public interface AppComponent extends AnotherComponent, FacebookComponent {} 

Dopo di che si può fare

@FragmentScope 
@Component(dependencies=AppComponent.class) 
public interface FragmentComponent extends AppComponent {} 

Si prega di notare che i fornitori senza ambito creare una nuova istanza su ogni chiamata inietti . Se è necessario il l'ambito, è necessario associare i moduli allo stesso componente, ma i componenti dovrebbero dipendere solo da altri componenti con l'intenzione di sottoscrizione.

0

includere nel modulo del modulo di dipendenza in questo modo:

@Module(includes = FacebookModule.class) 
public class AnotherModule {... 
Problemi correlati