Dagger 2 para módulos funcionales en Android | Autor: Mukul Pathak | Noviembre de 2021
Necesitaremos algunas interfaces que implementen BaseComponent
Estas interfaces garantizarán que los tipos de componentes utilizados por los módulos funcionales sean similares.
interface BaseComponent<T>
fun inject(target: T)
interface BaseActivityComponent<T : Activity> : BaseComponent<T>
interface BaseServiceComponent<T : Service> : BaseComponent<T>
interface BaseFragmentComponent<T : Fragment> : BaseComponent<T>//click here for full source code
Necesitaremos una gama personalizada de componentes de módulos funcionales.
@Scope
@Retention(RUNTIME)
annotation class FeatureScope//click here for full source code
Ahora nuestro módulo principal ha sido configurado y listo para un trabajo pesado, proporcionando una plataforma para intercambiar dependencias entre módulos funcionales.
Ahora configuremos el módulo de la aplicación:
La aplicación tiene un HomeComponent en el que necesitamos proporcionar dependencias desde el núcleo.
@Component(
modules = [HomeModule::class,RepositoryModule::class],
dependencies = [CoreComponent::class]
)
@FeatureScope
interface HomeComponent : BaseFragmentComponent<HomeFragment>@Component.Builder
//click here for full source code @Module
interface Builder
fun build(): HomeComponent
@BindsInstance fun homeFragment(fragmentComponent: HomeFragment): Builder
fun coreComponent(module: CoreComponent): Builder
class HomeModule //click here for full source code@Module
class RepositoryModule //click here for full source code
HomeModule y RepositoryModule son solo los módulos requeridos por el componente Home para proporcionar dependencias específicas de la aplicación.
Ahora comencemos nuestro CoreComponent primero, y luego iniciemos HomeComponent.
class MovieApp : Application()
override fun onCreate()
super.onCreate()override fun attachBaseContext(base: Context)
super.attachBaseContext(base)
// SplitCompat.install(this)private val coreComponent: CoreComponent by lazy
DaggerCoreComponent.builder().application(this).build()companion object
//click here for full source code
@JvmStatic
fun coreComponent(context: Context) =
(context.applicationContext as MovieApp).coreComponent
Extensión auxiliar para inicializar DaggerHomeComponent
fun Fragment.coreComponent() = this.context?.let MovieApp.coreComponent(it) fun HomeFragment.inject()
this.coreComponent()?.let
DaggerHomeComponent.builder()
.coreComponent(it).homeFragment(this)
.build()
.inject(this)
//click here for full source code
Inicie Dagger Graph en HomeFragment de la siguiente manera:
this.inject()//click here for full source code
Google recomienda inicializar en onAttach, pero lo he hecho en onCreateView en Fragments.
¿Ha notado que todavía no hemos mencionado el módulo movie_detail porque movie_detail es un módulo funcional y no debe ser referenciado en los módulos de la aplicación porque movie_detail depende de la aplicación y viceversa?
Hagamos lo mismo con nuestro módulo movie_detail que hicimos con el módulo de la aplicación.
@Component(
modules = [MovieDetailModule::class, MovieDetailRepositoryModule::class],
dependencies = [CoreComponent::class]
)
@FeatureScope
interface MovieDetailComponent : BaseFragmentComponent<MovieDetailFragment>@Component.Builder
interface Builderfun build(): MovieDetailComponent
//click here for full source code
@BindsInstance fun fragment(fragmentComponent: MovieDetailFragment): Builder
fun coreComponent(module: CoreComponent): Builder
@Module
class MovieDetailModule //click here for full source code@Module
class MovieDetailRepositoryModule //click here for full source code
Nuestro componente MovieDetailFragment se encuentra en MovieDetailActivity en el módulo movie_detail.
Extensión auxiliar de MovieDetailFragment
fun MovieDetailFragment.inject()
this.startCoreComponent()?.let
DaggerMovieDetailComponent.builder()
.coreComponent(it).fragment(this)
.build()
.inject(this)
//click here for full source code
this.startCoreComponent () creará corecomponent pero debido a que corecomponent está marcado como @Singleton, esto garantizará que la instancia no se vuelva a crear
Asegúrese de limpiar y reconstruir.
Ejecutar utilizando el mismo elemento de pago
https://github.com/mklpathak/starter_app