Noch einen DI?

Lernen Sie Hilt - Dependency Injection (DI) in JetPack kennen, aber das stimmt nicht, da Hilt nur ein Wrapper um Dagger2 ist. Für kleine Projekte kann es als bequemeres Werkzeug eingesetzt werden und lässt sich gut in die übrigen Produkte von JetPack integrieren.



Ich werde nicht beschreiben, wie man das Projekt hinzufügt, alles ist im Artikel gut beschrieben



Wozu?



Dagger2 ist eine ziemlich komplexe DI, Sie können leicht verwirrt werden, was und wo Sie es setzen. Eine unendliche Anzahl von Komponenten entwickeln und die Anzahl der Abstraktionen erhöhen. Und je größer das Projekt, desto mehr Verwirrung entsteht.



Und wenn Sie Dagger2 verwenden möchten, aber mit minimalem Aufwand, dann wurde Hilt dafür erfunden.



Was für uns vereinfacht wurde:



  • Vorgefertigte Komponenten (aus den Namen geht hervor, worauf sie sich beziehen)

    • ApplicationComponent
    • ActivityRetainedComponent
    • ActivityComponent
    • FragmentComponent
    • ViewComponent
    • ViewWithFragmentComponent
    • ServiceComponent
  • Im Modul geben Sie an, welche Komponente hinzugefügt werden soll
  • Über @AndroidEntryPoint Hilt generiert der Compiler die gesamte Bolierplate für die Erstellung und Speicherung von Komponenten (z. B. speichert ActivityRetainedComponent die Entität nach der Bildschirmdrehung, ActivityComponent wird neu erstellt).


Dieser Code sieht ziemlich elegant aus (die gesamte Boilerplate wird für uns generiert)



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


Eigenschaften:



Bewerbung ist erforderlich



Sie müssen Application deklarieren und @HiltAndroidApp markieren, ohne es funktioniert Hilt nicht.



@HiltAndroidApp
class App : Application() { }


Hierarchische Abhängigkeit



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