android dagger-2 android-instant-apps

Construyendo una aplicación instantánea para Android con componente de aplicación de Dagger



dagger-2 android-instant-apps (2)

Actualmente estoy experimentando con InstantApps y me gustaría incluir daga en mi proyecto.

Me enfrento a un problema al configurar una aplicación AppComponent. Mi componente de aplicación incluye todos los módulos de daga de características de mi aplicación.

Básicamente tengo:

  • Un módulo de aplicación base que contiene mi clase de aplicación
  • Múltiples características con cada Módulo de daga por Actividad, todas con Base como una dependencia.
  • Un módulo de aplicación y un módulo instantáneo importan todas las características y el módulo de aplicación base.

Estoy tratando de averiguar la configuración antes de agregar el módulo de aplicación instantánea.

Desde la documentación de InstantApps y ejemplos de proyectos. Parece que la clase Aplicación debe estar en Base. Desde la documentación de Dagger, para configurar dagger:

DaggerYourAppComponent.create().inject(this);

Debe ser incluido en su clase de aplicación. Sin embargo, esto parece ser imposible ya que AppComponent necesita hacer referencia a todos los módulos de daga de características.

Mis preguntas son:

  • ¿Dónde debo agregar mi módulo de daga AppComponent?
  • ¿Debo mantener mi solicitud en el módulo de la aplicación y no en la Base?
  • ¿Algún repo o documentación de GitHub sobre Dagger con aplicaciones instantáneas?

Gracias


Escribí un artículo sobre esto con muchos detalles: Dagger2 para arquitectura modular , pero siguiendo la breve respuesta.

Tienes que usar Dagger2 de una manera diferente. En lugar de usar un módulo o subcomponente para cada módulo de características, debe usar un componente con una dependencia del AppComponent base.

En un solo módulo solemos hacer algo como esto:

@Singleton @Component(modules = arrayOf(NetworkModule::class, RepositoryModule::class, SubcomponentModule::class)) interface ApplicationComponent : AndroidInjector<MyApplication> { val userRepository: UserRepository val apiService: ApiService } @Module object NetworkModule { @Provides @Singleton @JvmStatic fun provideApiService(okHttp: OkHttp): ApiService { return ApiSerive(okHttp) } }

Pero como usted dijo, no tiene acceso a SubComponentModule que podría estar en otro módulo o en módulos de referencia de dagas en otro módulo de funciones.

Solo puede crear un nuevo módulo de daga en un módulo de función dependiendo de ApplicationComponent como este:

@Browser @Component(modules = [(BrowserModule::class)], dependencies = [(AppComponent::class)]) interface BrowserComponent : AndroidInjector<AppCompatActivity> { @Component.Builder abstract class Builder: AndroidInjector.Builder<AppCompatActivity>(){ /** * explicity declare to Dagger2 * that this builder will accept an AppComponent instance **/ abstract fun plus(component: AppComponent): Builder } }

Y la actividad de la característica correspondiente construirá el componente:

class BrowserActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) DaggerBrowserComponent .builder() /** * we have to provide an instance of the AppComponent or * any other dependency for this component **/ .plus((application as MyApplication).component) .build() .inject(this) } }


  • Dagger2 es muy compatible con aplicaciones instantáneas. Puede crear clases de componentes para cada módulo de funciones y una clase de proveedor de Dagger correspondiente para exponer la instancia de la clase de componentes para cada módulo de funciones.
  • Cada clase de componente de módulo puede declarar métodos de inyección para las clases contenidas solo en ese módulo de característica.
  • Además, también puede tener una clase de componente de aplicación en el módulo base para la inyección en toda la aplicación.
  • La clase de componente de la aplicación se puede crear una instancia en la clase de aplicación incluida en el módulo base y expuesta a otros módulos de características a través del método estático en la clase de aplicación.

Aquí hay un ejemplo de código de inyección Dagger2 con aplicaciones instantáneas para aclarar las cosas. https://github.com/willowtreeapps/android-instant-apps-demo