Ny Android Injector med Dagger 2 – del 3

Hvis du ikke har læst del 1 og del 2, anbefaler jeg, at du læser dem først. Du kan finde links nederst.

TLDR;

Du kan bruge DaggerActivity, DaggerFragment, DaggerApplication til at reducere boilerplate i din aktivitet/fragment/applikation.

Du kan også bruge AndroidInjector<T> i dine dagger-komponenter for også at reducere boilerplate.

Husk, at vi kalder AndroidInjection.inject() hver aktivitet eller fragment, som vi ønskede at bruge dagger. Og også, Hvis du vil bruge Injection i dit fragment, skal du også implementere HasSupportFragmentInject-grænsefladen og overskrive fragmentinjektoren i din aktivitet.

For nylig flyttede jeg denne kode til min basisaktivitet og mit basisfragment. Hvorfor skal jeg erklære det for hver enkelt aktivitet? Jeg mener, at det er acceptabelt at flytte dem til basisklassen.

Så ser jeg nogle klasser i dagger-projektet, mens jeg forsker, DaggerAppCompatActivity og DaggerFragment. Disse klasser gør præcis, hvad jeg gjorde. Android elsker arv. Så vi kan lade som om, at vi også elsker det 😛

Lad os se, hvad der sker inde i disse biblioteksklasser.

DaggerAppCompatActivity

Det er faktisk ikke anderledes. Vi kan reducere boilerplate-koden i vores aktivitet ved at udvide vores aktivitet fra DaggerAppCompatActivity.

Vores DetailActivity-klasse var som følgende;

Lad os udvide den fra DaggerAppCompatActivity og fjerne HasSupportFragmentInjector og overrided-metoden fra vores aktivitet.

Nu er det bedre.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

Lad os se, hvad vi ellers kan gøre for at reducere boilerplate-kode. AndroidInjector hjælper os med at forenkle vores app-komponent. Du kan tjekke AndroidInjector-dokumentationen herfra.

Lad os se vores app-komponent og applikationsklasse.

build() og seedInstance() er allerede defineret i AndroidInjector.Builder-klassen. Så vi kan slippe af med dem og udvide vores Builder fra AndroidInjection.Builder<Application>.

Og desuden har AndroidInjector-grænsefladen inject()-metoden i den. Så vi kan fjerne inject()-metoden og udvide vores AppComponent-interface fra AndroidInjector<Application>

Så vores opdaterede og boilerplate-reducerede AppComponent-interface vil se ud som følger

Er du klar over, at vi også har ændret vores moduler. Jeg fjernede AndroidInjectionModule.class i komponentmoduler og tilføjede AndroidSupportInjectionModule.class. Dette er tilføjet, fordi vi brugte support Fragment. AndroidInjectionModule binder din app.Fragment til dagger. Men hvis du vil bruge injektion i v4.fragment, skal du tilføje AndroidSupportInjectionModule.class til dine AppComponent-moduler.

Vi ændrede den måde, vi injicerer i vores AppComponent på. Så lad os se, hvad der er ændret i vores applikationsklasse.

Som i DaggerActivity og DaggerFragment skal vi også udvide vores applikationsklasse fra DaggerApplication.

Vores Application-klasse var ser ud som følgende;

Vi ændrede den til:

Source

Du kan finde denne forenklede implementering som en gren på min github-side. Jeg fletter den ikke ind i master, fordi jeg ønsker at vise den gammeldags måde at bruge dagger på i alle grene. Så læserne kan følge en vej fra old-school måde til forenklet måde.

PS.

Leave a Reply