Cómo reemplazar dependencias dentro de Scopes en Dagger 2
¿Cómo puede anular las dependencias dentro de los diferentes ámbitos de Dagger 2? Ejemplo:
Tengo dos componentes en mi aplicación: ApplicationComponent
y ActivityComponent
. ApplicationComponent
es el componente base y ActivityComponent
es un componente del ámbito en el que desea realizar la anulación.
- Error al inflar el fragmento de clase
- TableLayout: quita espacio entre columnas
- Conexión Bluetooth no segura en Android
- Android webview.loadUrl no cargará otra página web
- El método más rápido y eficiente para buscar los 3 primeros números?
Para este ejemplo he creado esos modelos:
public class Parrot { private final HelloPrinter helloPrinter; public Parrot(HelloPrinter helloPrinter) { this.helloPrinter = helloPrinter; } public void sayHello(){ helloPrinter.print(); } } public interface HelloPrinter { void print(); } public class AppHelloPrinter implements HelloPrinter{ @Override public void print() { System.out.println("Hello Application"); } } public class ActivityHelloPrinter implements HelloPrinter { @Override public void print() { System.out.println("Hello Activity"); } }
Y el código:
ApplicationComponent applicationComponent = DaggerApplicationComponent.builder().build(); applicationComponent.provideParrot().sayHello(); activityComponent = DaggerActivityComponent.builder() .applicationComponent(applicationComponent).build(); activityComponent.provideParrot().sayHello();
Mi salida deseada es:
Hello Application Hello Activity
Así que hice los módulos:
ApplicationModule:
@Singleton @Component(modules = ApplicationModule.class) public interface ApplicationComponent { Parrot provideParrot(); } @Module public class ApplicationModule { @Provides @Singleton HelloPrinter providePrinter(){ return new AppHelloPrinter(); } @Provides Parrot provideParrot(HelloPrinter helloPrinter) { return new Parrot(helloPrinter); } }
ActivityModule: Intentar anular el HelloPrinter
@PerActivity @Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class) public interface ActivityComponent { Parrot provideParrot(); } @Module @PerActivity public class ActivityModule { @Provides @PerActivity HelloPrinter provideHelloPrinter() { return new ActivityHelloPrinter(); } }
Pero con esta configuración la salida es:
Hello Application Hello Application
¿Qué estoy haciendo mal? Gracias
- Proyecto de Android incapaz de hacer referencia a otro proyecto en eclipse
- SearchView escucha voces
- En la aplicación de facturación - BillingHelper no completamente instanciado
- Cambiar valores en matriz no se propaga en la aplicación
- Android FFmpegMediaMetadataRetriever.getFrameAtTime () es lento
- ¿Cómo puedo reutilizar una clase interna en Java / Android?
- Selector de imágenes de preferencias de Android: cómo recibir resultados en DialogPreference
- Error de Android NDK ndk-build helloJni
La respuesta corta es … no puedes hacer eso.
Con la daga todo se hace en tiempo de compilación.
-
Usted tiene un componente de aplicación, que sabe cómo construir un
HelloPrinter
y unParrot
.
A continuación, exponga elParrot
para todos los componentes a utilizar. -
Usted tiene su componente de actividad, que también sabe cómo construir un
HelloPrinter
!
¿Así que lo que ocurre?
Tenga en cuenta el gráfico de objetos. Los componentes saben lo que pueden construir y dependen de otros componentes, exponiendo objetos conocidos ellos mismos.
applicationComponent.provideParrot().sayHello();
Éste es fácil. Usted crea el componente, usted quiere un loro y se construye usando la impresora conocida.
activityComponent.provideParrot().sayHello();
Lo que sucede aquí, es (básicamente) lo mismo. Dices que quieres un loro. Su componente de actividad no sabe cómo hacer una, sólo sabe cómo hacer una impresora!
Pero espera. Tiene una dependencia de un componente de aplicación, exponiendo convenientemente una Fábrica de Parrot
.
La fábrica de componentes de la aplicación se llama y el loro se instancia. Dado que el módulo de aplicación sabe cómo construir una impresora, utiliza el que está a la mano.
…ahora que
Así que … usted podría proporcionar a los loros en su componente de actividad, que luego utilizaría una impresora diferente!
Gradle: error: Parrot se une varias veces
Aquí obtendríamos 2 loros en nuestro gráfico de objetos, ya que no hay "sobrescribir" sucediendo. Esto no funcionará, y no debería.
Conclusión
No hay forma de anular los métodos. Tan pronto como HelloPrinter
un segundo Parrot
o HelloPrinter
fallará la compilación.
La única posibilidad de lograr una funcionalidad similar sería utilizar las anotaciones @Named()
en qué impresora usar y / o tirar de la creación entera del loro hacia abajo en el módulo de actividad.
Y por favor, corrija si me falta algo, pero ni siquiera veo una manera de mantener la firma de la misma con el uso de anotaciones con nombre.
- ¿Cuál es el punto de `Content_main.xml`?
- Video ffmpeg comprimido pero no se reproduce en el navegador