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