Noul Android Injector cu Dagger 2 – partea 3

Dacă nu ați citit partea 1 și partea 2, vă sugerez să le citiți mai întâi. Puteți găsi link-uri în partea de jos.

TLDR;

Puteți utiliza DaggerActivity, DaggerFragment, DaggerApplication pentru a reduce boilerplate în activitatea/fragmentul/aplicația dvs.

De asemenea, puteți utiliza AndroidInjector<T> în componentele dvs. dagger pentru a reduce și boilerplate.

Amintiți-vă că apelăm AndroidInjection.inject() la fiecare activitate sau fragment pe care am vrut să îl folosim dagger. Și, de asemenea, Dacă doriți să utilizați Injection în fragmentul dvs., ar trebui să implementați, de asemenea, interfața HasSupportFragmentInject și să suprascrieți injectorul de fragment în activitatea dvs..

Recent, am mutat acest cod în activitatea mea de bază și în fragmentul de bază. De ce ar trebui să trebuiască să declar asta pentru fiecare activitate în parte? Cred că mutarea lor în clasa de bază este acceptabilă.

Apoi am văzut câteva clase în proiectul dagger în timp ce făceam cercetări, DaggerAppCompatActivity și DaggerFragment. Aceste clase fac exact ceea ce am făcut eu. Android iubește moștenirea. Așa că putem să ne prefacem că și noi iubim asta 😛

Să vedem ce se întâmplă în interiorul acestor clase de bibliotecă.

DaggerAppCompatActivity

Nimic diferit de fapt. Putem reduce codul de tip boilerplate în activitatea noastră prin extinderea activității noastre din DaggerAppCompatActivity.

Clasa noastră DetailActivity era următoarea;

Să o extindem din DaggerAppCompatActivity și să eliminăm HasSupportFragmentInjector și metoda overrided din activitatea noastră.

Acum, este mai bine.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

Să vedem ce mai putem face pentru a reduce codul boilerplate. AndroidInjector ne ajută să simplificăm componenta noastră de aplicație. Puteți verifica documentația AndroidInjector de aici.

Să vedem componenta noastră de aplicație și clasa de aplicație.

build() și seedInstance() sunt deja definite în clasa AndroidInjector.Builder. Deci, putem scăpa de ele și putem extinde Builder-ul nostru din AndroidInjection.Builder<Application>.

Și, de asemenea, interfața AndroidInjector are metoda inject() în ea. Așadar, putem elimina metoda inject() și putem extinde interfața noastră AppComponent din AndroidInjector<Application>

Atunci, interfața noastră AppComponent actualizată și redusă la boilerplate va arăta după cum urmează

Ați realizat că am schimbat și modulele noastre. Am eliminat AndroidInjectionModule.class din modulele componente și am adăugat AndroidSupportInjectionModule.class. Aceasta este adăugată pentru că am folosit Support Fragment. AndroidInjectionModule leagă app.Fragment de dagger. Dar dacă doriți să utilizați injecția în v4.fragment, atunci ar trebui să adăugați AndroidSupportInjectionModule.class la modulele AppComponent.

Am schimbat modul în care facem injecția în AppComponent. Deci, haideți să vedem ce s-a schimbat în clasa noastră Application.

La fel ca în DaggerActivity și DaggerFragment, trebuie să extindem clasa noastră Application din DaggerApplication.

Clasa noastră de aplicație arăta după cum urmează;

Am schimbat-o în..

Source

Puteți găsi această implementare simplificată ca o ramură în pagina mea github. Nu o unesc în master pentru că vreau să arăt modul old school de a folosi dagger în fiecare ramură. Astfel, cititorii pot urmări un drum de la modul old-school la modul simplificat.

PS.

.

Leave a Reply