Dagger2: Error cuando dos componentes tienen la misma firma de método de inyección

Tengo este componente:

@Singleton @Component(modules = OauthModule.class) public interface OauthComponent { void inject(LoginActivity a); } 

Y el módulo:

 @Module public class OauthModule { @Provides @Singleton Oauth2Service provideOauth2Service() { return new Oauth2StaticService(); } } 

Y este otro componente:

 @Singleton @Component(modules = LoggedUserModule.class) public interface LoggedUserComponent { void inject(LoginActivity a); } 

Y obtengo este error:

Error: (15, 10) error: Oauth2Service no se puede proporcionar sin un método @ Provides- o @ Produces-annotated.

Si cambio el parámetro del método de inyección de LoggedUserComponent para que sea otra Activity , diga AnotherActivity como esto:

 @Singleton @Component(modules = LoggedUserModule.class) public interface LoggedUserComponent { void inject(AnotherActivity a); } 

La compilación está bien. ¿Por qué? ¿No puedo tener dos componentes con la misma firma de inyección?

Estoy tratando de entender cómo funciona Dagger para que cualquier ayuda será apreciada. Gracias.

Piense en la dagger como un gráfico de objetos, que en realidad es. Usted probablemente no debería tener dos componentes diferentes que son capaces de inyectar el mismo objeto, excepto para fines de prueba (o si desea incluir un comportamiento diferente, no uno adicional).

Si su LoginActivity depende de varios módulos, debe agregarlos en un solo componente, ya que como su error muestra, dagger fallará si no puede proporcionar todas las dependencias de un solo componente.

 @Singleton @Component(modules = {LoggedUserModule.class, OauthModule.class}) public interface LoggedUserComponent { void inject(AnotherActivity a); } 

Mirando a Oauth2Service , esto podría ser algo que varios objetos podrían usar, por lo que un mayor alcance podría ser adecuado. En ese caso, debe pensar en agregarlo con un alcance @Singleton a su componente de aplicación, o tal vez crear su propio componente con, por ejemplo, un @UserScope .

Entonces tendrías que hacer tu LoggedUserComponent un @Subcomponent o declarar este componente una dependencia usando @Component(dependencies = OauthComponent.class) y proporcionar un getter en OauthComponent para ello. En ambos casos la daga también podría proporcionar la dependencia encontrada más arriba en el gráfico, así también resolviendo su error.

Se está volviendo loco porque está diciendo que puede inyectarse en esa clase pero no está proporcionando una clase que espera que proporcione. Sólo tiene que agregar el OauthModule a su LoggedUserComponent. Prueba esto

 @Singleton @Component(modules = {LoggedUserModule.class, OauthModule.class}) public interface LoggedUserComponent { void inject(LoginActivity loginActivity); } 
  • ¿La manera más simple de crear un Singleton w / Dagger 2?
  • Daga que no genera componentes para / clase de prueba
  • No se puede proporcionar sin un constructor @Inject o de un método @ Proporcionado-anotado
  • Cómo usar daga en un proyecto de biblioteca de Android
  • Dagger 2 inyectar parámetros del constructor
  • Dagger 2, módulos de biblioteca y @Singleton
  • Dagger2 y Android
  • Java.lang.NoClassDefFound usando Dagger 2 para Android 4
  • Daga 2 en Android. Diferentes maneras de almacenar y acceder a un componente @Singleton
  • @Injects después de @Produces?
  • Campo no inyectado en el proyecto Android Dagger
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.