Uusi Android-injektori tikarilla 2 – osa 3

Jos et ole lukenut osaa 1 ja osaa 2, suosittelen lukemaan ne ensin. Löydät linkit alareunasta.

TLDR;

Voit käyttää DaggerActivityä, DaggerFragmenttia, DaggerApplicationia vähentämään boilerplatea Activityssäsi/Fragmentissa/Applikaatiossasi.

Myös voit käyttää AndroidInjector<T> dagger-komponenteissasi vähentämään boilerplatea.

Muista, että kutsumme AndroidInjection.inject() jokaista aktiviteettia tai fragmenttia, jonka halusimme käyttää daggeria. Ja myös, Jos haluat käyttää Injectionia fragmentissasi, sinun pitäisi myös toteuttaa HasSupportFragmentInject-rajapinta ja ohittaa fragmentti-injektori aktiviteetissasi.

Viime aikoina siirsin tuon koodin perusaktiviteettiini ja perusfragmenttiini. Miksi minun pitäisi julistaa tuo jokaiseen aktiviteettiin? Mielestäni niiden siirtäminen perusluokkaan on hyväksyttävää.

Silloin näen Dagger-projektissa joitakin luokkia tutkiessani, DaggerAppCompatActivity ja DaggerFragment. Nämä luokat tekee juuri sen, mitä minä tein. Android rakastaa periytymistä. Voimme siis teeskennellä, että mekin rakastamme sitä 😛

Katsotaanpa, mitä näiden kirjastoluokkien sisällä tapahtuu.

DaggerAppCompatActivity

Ei oikeastaan mitään erilaista. Voimme vähentää boilerplate-koodia aktiviteetissämme laajentamalla aktiviteettimme DaggerAppCompatActivitystä.

Meidän DetailActivity-luokkamme oli seuraavanlainen;

Laajennetaan se DaggerAppCompatActivitystä ja poistetaan HasSupportFragmentInjector ja overrided-metodi aktiviteetistamme.

Nyt se on parempi.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

Katsotaan, mitä muuta voimme tehdä boilerplate-koodin vähentämiseksi. AndroidInjector auttaa meitä yksinkertaistamaan App-komponenttiamme. Voit tarkistaa AndroidInjectorin dokumentaation täältä.

Katsotaanpa sovelluskomponenttimme ja sovellusluokkamme.

build() ja seedInstance() on jo määritelty AndroidInjector.Builder-luokassa. Voimme siis päästä niistä eroon ja laajentaa Builderimme AndroidInjection.Builder<Application>:stä.

Ja lisäksi AndroidInjector-rajapinnassa on inject()-metodi. Voimme siis poistaa inject()-metodin ja laajentaa AppComponent-rajapintamme AndroidInjector<Application>

Siten päivitetty ja boilerplate-vähennetty AppComponent-rajapintamme näyttää seuraavalta

Totesitko, että muutimme myös moduuliamme. Poistin komponenttimoduuleista AndroidInjectionModule.classin ja lisäsin AndroidSupportInjectionModule.classin. Tämä on lisätty, koska käytimme tukea Fragment. AndroidInjectionModule sitoo app.Fragmentin daggeriin. Mutta jos haluat käyttää injektiota v4.fragmentissa, sinun pitäisi lisätä AndroidSupportInjectionModule.class AppComponent-moduuleihisi.

Muutimme tapaa, jolla injektoimme AppComponenttiimme. Katsotaanpa siis, mikä on muuttunut Application-luokassamme.

Aivan kuten DaggerActivityssä ja DaggerFragmentissa, meidän on myös laajennettava Application-luokkaamme DaggerApplicationista.

Application-luokkamme näytti seuraavalta;

Muutimme sen muotoon..

Source

Tämä yksinkertaistettu toteutus löytyy haarana github-sivultani. En sulauta sitä masteriin, koska haluan näyttää vanhan koulukunnan tavan käyttää daggeria jokaisessa haarassa. Lukijat voivat siis seurata tietä vanhan koulukunnan tavasta yksinkertaistettuun tapaan.

PS.

Leave a Reply