2016-03-03 18 views
8

ho questo componente:Dagger2: errore quando due componenti ha stesso inietti metodo firma

@Singleton 
@Component(modules = OauthModule.class) 
public interface OauthComponent { 

    void inject(LoginActivity a); 

} 

e il modulo:

@Module 
public class OauthModule { 

    @Provides 
    @Singleton 
    Oauth2Service provideOauth2Service() { 
     return new Oauth2StaticService(); 
    } 

} 

e questo un altro componente:

@Singleton 
@Component(modules = LoggedUserModule.class) 
public interface LoggedUserComponent { 

    void inject(LoginActivity a); 

} 

e Ho ricevuto questo errore:

Error:(15, 10) error: Oauth2Service cannot be provided without an @Provides- or @Produces-annotated method.

Se cambio parametro del metodo inject s' il LoggedUserComponent essere un altro Activity, dicono AnotherActivity come questo:

@Singleton 
@Component(modules = LoggedUserModule.class) 
public interface LoggedUserComponent { 

    void inject(AnotherActivity a); 

} 

compilazione è ok. Perché? Non posso avere due componenti con la stessa firma iniettata?

Sto cercando di capire come funziona Dagger così ogni aiuto sarà apprezzato. Grazie.

risposta

7

Pensate dagger come un oggetto grafico —, che è in realtà. Probabilmente dovresti non avere 2 componenti diversi in grado di iniettare lo stesso oggetto, tranne che a scopo di test (o se vuoi includere un comportamento diverso, non uno aggiuntivo).

Se il LoginActivity dipende da più moduli, li si dovrebbe aggregare in un unico componente, poiché, come i tuoi programmi di errore, pugnale fallirà se non in grado di fornire tutte le le dipendenze da un singolo componente.

@Singleton 
@Component(modules = {LoggedUserModule.class, OauthModule.class}) 
public interface LoggedUserComponent { 

    void inject(AnotherActivity a); 

} 

Guardando Oauth2Service, questo potrebbe essere facilmente qualcosa che più oggetti potrebbero utilizzare, quindi un campo di applicazione più elevato potrebbe essere sufficiente. In tal caso, dovresti pensare di aggiungerlo con uno scope @Singleton al componente dell'applicazione, o magari creare il proprio componente con ad es. a @UserScope.

Poi si dovrebbe rendere il vostro sia un LoggedUserComponent@Subcomponent o dichiarare questa componente una dipendenza utilizzando @Component(dependencies = OauthComponent.class) e fornendo un getter in OauthComponent per esso. In entrambi i casi il pugnale sarebbe anche in grado di fornire la dipendenza trovata più in alto nel grafico, risolvendo così anche il tuo errore.

0

Si sta arrabbiando perché stai dicendo che puoi inserirti in quella classe ma non stai fornendo una classe che si aspetta che tu fornisca. Hai solo bisogno di aggiungere OauthModule al tuo LoggedUserComponent. Prova questo

@Singleton 
@Component(modules = {LoggedUserModule.class, OauthModule.class}) 
public interface LoggedUserComponent { 

    void inject(LoginActivity loginActivity); 

} 
+0

Cosa succede se il mio OAuthModule è singleton? non potrò mai iniettare? – sector11

+0

Non sono sicuro di seguire quello che stai chiedendo – ootinii

Problemi correlati