Ny Android Injector med Dagger 2 – del 3

Om du inte har läst del 1 och del 2 föreslår jag att du läser dem först. Du hittar länkar längst ner.

TLDR;

Du kan använda DaggerActivity, DaggerFragment, DaggerApplication för att minska boilerplate i din Activity/Fragment/Application.

Du kan också använda AndroidInjector<T> i dina dagger-komponenter för att minska boilerplate också.

Håll dig i minnet att vi kallar AndroidInjection.inject() varje aktivitet eller fragment som vi ville använda dagger. Och också, Om du vill använda Injection i ditt fragment bör du också implementera HasSupportFragmentInject-gränssnittet och åsidosätta fragmentinjektorn i din aktivitet.

Nu flyttade jag den koden till min basaktivitet och mitt basfragment. Varför ska jag behöva deklarera det för varje enskild aktivitet? Jag tycker att det är acceptabelt att flytta dem till basklassen.

När jag forskar om Dagger-projektet ser jag några klasser, DaggerAppCompatActivity och DaggerFragment. Dessa klasser gör exakt samma sak som jag gjorde. Android älskar arv. Så vi kan låtsas att vi också älskar det 😛

Låt oss se vad som händer inuti dessa biblioteksklasser.

DaggerAppCompatActivity

Inte något annorlunda faktiskt. Vi kan minska koden i vår aktivitet genom att förlänga vår aktivitet från DaggerAppCompatActivity.

Vår DetailActivity-klass såg ut på följande sätt;

Låt oss förlänga den från DaggerAppCompatActivity och ta bort HasSupportFragmentInjector och overrided-metoden från vår aktivitet.

Nu är det bättre.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

Låt oss se vad vi kan göra mer för att minska boilerplate-koden. AndroidInjector hjälper oss att förenkla vår App Component. Du kan kolla AndroidInjector-dokumentationen här.

Låt oss se vår appkomponent och applikationsklass.

build() och seedInstance() är redan definierade i klassen AndroidInjector.Builder. Så vi kan göra oss av med dem och förlänga vår Builder från AndroidInjection.Builder<Application>.

Och dessutom har AndroidInjector-gränssnittet inject()-metoden i det. Så vi kan ta bort inject()-metoden och utöka vårt AppComponent-gränssnitt från AndroidInjector<Application>

Så vårt uppdaterade och boilerplate-reducerade AppComponent-gränssnitt kommer att se ut på följande sätt

Var du medveten om att vi ändrade våra moduler också. Jag tog bort AndroidInjectionModule.class i komponentmoduler och lade till AndroidSupportInjectionModule.class. Denna läggs till eftersom vi använde oss av support Fragment. AndroidInjectionModule binder din app.Fragment till dagger. Men om du vill använda injektion i v4.fragment bör du lägga till AndroidSupportInjectionModule.class i dina AppComponent-moduler.

Vi har ändrat hur vi injicerar i vår AppComponent. Låt oss se vad som har ändrats i vår applikationsklass.

Samma som i DaggerActivity och DaggerFragment måste vi också utöka vår applikationsklass från DaggerApplication.

Vår Application-klass såg ut på följande sätt;

Vi ändrade den till:

Source

Denna förenklade implementering finns som en gren på min github-sida. Jag lägger inte samman den till master eftersom jag vill visa det gamla skolans sätt att använda dagger i varje gren. Så läsarna kan följa en väg från gammaldags sätt till förenklat sätt.

PS.

Leave a Reply