Generalidades

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>

Necesitaremos una gama personalizada de componentes de módulos funcionales.

@Scope
@Retention(RUNTIME)
annotation class FeatureScope

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
interface Builder
fun build(): HomeComponent
@BindsInstance fun homeFragment(fragmentComponent: HomeFragment): Builder
fun coreComponent(module: CoreComponent): Builder

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
@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)

Inicie Dagger Graph en HomeFragment de la siguiente manera:

this.inject()

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 Builder

fun build(): MovieDetailComponent
@BindsInstance fun fragment(fragmentComponent: MovieDetailFragment): Builder
fun coreComponent(module: CoreComponent): Builder

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

LEER  ¿Cómo actualizar su aplicación de Android cuando pierde la clave de firma de la aplicación? | Autor: Shubham Patwa | Junio ​​de 2021

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba