¿Empuña otro DI?

Conozca a Hilt - Inyección de dependencia (DI) en JetPack, pero eso no es cierto ya que Hilt es solo un envoltorio de Dagger2. Para proyectos pequeños podrá destacarse como una herramienta más conveniente y se integra bien con el resto de productos en JetPack.



No describiré cómo agregar al proyecto, todo está bien descrito en el artículo.



¿Para qué?



Dagger2 es un DI bastante complejo, puede confundirse fácilmente qué y dónde lo pone. Generar un número infinito de componentes y aumentar el número de abstracciones. Y cuanto más grande es el proyecto, más confusión aumenta.



Y si desea usar Dagger2, pero con un mínimo esfuerzo, entonces Hilt fue inventado para esto.



Lo que nos simplificó:



  • Componentes listos para usar (de los nombres está claro a qué se refieren)

    • ApplicationComponent
    • ActivityRetainedComponent
    • ActivityComponent
    • FragmentComponent
    • ViewComponent
    • ViewWithFragmentComponent
    • ServiceComponent
  • En el módulo, especifica qué componente agregar
  • A través de @AndroidEntryPoint Hilt, el compilador genera el bolierplate completo para la creación y el almacenamiento de componentes (por ejemplo, ActivityRetainedComponent guardará la entidad después de la rotación de la pantalla, ActivityComponent volverá a crear).


Este código se ve bastante elegante (se generará todo el texto estándar para nosotros)



@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() { 
    @Inject lateinit var testService: TestService
}


caracteristicas:



Se requiere solicitud



Debe declarar Aplicación y marcar @HiltAndroidApp, sin ella, Hilt no funcionará.



@HiltAndroidApp
class App : Application() { }


Dependencia jerárquica



Hilt , Activity @AndroidEntryPoint



View @WithFragmentBindings Fragment @AndroidEntryPoint, Activity Fragment





Dagger2, , @InstallIn. , .



@InstallIn(ApplicationComponent::class)
@Module
class NetworkModule {
    @Singleton
    @Provides
    fun provideHttpService(): HttpService {
        return object : HttpService {
            init {
                Log.e("Tester", "HttpService initialized")
            }
            override fun request() {
                Log.e("Tester", "HttpService::request")
            }
        }
    }
}


Hilt, @InstallIn, , .



Component Subcomponent



, Dagger2, Hilt . :



DaggerLoginComponent.builder()
        .context(this)
        .appDependencies(
          EntryPointsAccessors.fromApplication(
            applicationContext,
            LoginModuleDependencies::class.java
          )
        )
        .build()
        .inject(this)




, . ( ), Dagger2.



@AndroidEntryPoint



  • Activity ComponentActivity AppCompatActivity
  • Fragment androidx.Fragment
  • Retain




Hilt :



  • Dagger Component-
  • Application, Activity, Fragment, View ., @AndroidEntryPoint
  • Dagger


ActivityRetainedComponent



ViewModel arch :



this.viewModelProvider =
        new ViewModelProvider(
            activity,
            new ViewModelProvider.Factory() {
              @NonNull
              @Override
              @SuppressWarnings("unchecked")
              public <T extends ViewModel> T create(@NonNull Class<T> aClass) {
                ActivityRetainedComponent component =
                    ((GeneratedComponentManager<LifecycleComponentBuilderEntryPoint>)
                            activity.getApplication())
                        .generatedComponent()
                        .retainedComponentBuilder()
                        .build();
                return (T) new ActivityRetainedComponentViewModel(component);
              }
            });




:



  • Dagger2
  • ( )
  • boilerpate .
  • Dagger2 ( , ..)


:



  • , , Dagger2
  • ,
  • Dagger2
  • , , Fragment Activity c @AndroidEntryPoint


:






All Articles