Nový Android Injector s dýkou 2 – část 3

Pokud jste nečetli část 1 a část 2, doporučuji vám, abyste si je přečetli jako první. Odkazy najdete dole.

TLDR;

K redukci kotle v aktivitě/fragmentu/aplikaci můžete použít DaggerActivity, DaggerFragment, DaggerApplication.

Také můžete použít AndroidInjector<T> ve svých komponentách dagger, abyste také redukovali boilerplate.

Pamatujte, že voláme AndroidInjection.inject() každou aktivitu nebo fragment, který jsme chtěli použít dagger. A také: Pokud chcete použít Injection ve svém fragmentu, měli byste také implementovat rozhraní HasSupportFragmentInject a přepsat injektor fragmentu ve své aktivitě.

Nedávno jsem tento kód přesunul do své základní aktivity a základního fragmentu. Proč bych to měl deklarovat pro každou jednotlivou aktivitu? Myslím, že jejich přesunutí do základní třídy je přijatelné.

Při zkoumání projektu dagger vidím některé třídy: DaggerAppCompatActivity a DaggerFragment. Tyto třídy dělají přesně to, co jsem udělal já. Android miluje dědičnost. Takže se můžeme tvářit, že to milujeme taky 😛

Podívejme se, co se děje uvnitř těchto knihovních tříd.

DaggerAppCompatActivity

Vlastně nic jiného. Můžeme omezit kotelní kód v naší aktivitě tím, že rozšíříme naši aktivitu z DaggerAppCompatActivity.

Naše třída DetailActivity vypadala takto;

Rozšíříme ji z DaggerAppCompatActivity a odstraníme HasSupportFragmentInjector a přepsanou metodu z naší aktivity.

Teď už je to lepší.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

Podívejme se, co ještě můžeme udělat, abychom omezili kotelní kód. AndroidInjector nám pomůže zjednodušit naši komponentu aplikace. Dokumentaci k AndroidInjectoru si můžete prohlédnout zde.

Podívejme se na naši komponentu aplikace a třídu aplikace.

build() a seedInstance() je již definována ve třídě AndroidInjector.Builder. Můžeme se jich tedy zbavit a rozšířit náš Builder z AndroidInjection.Builder<Application>.

A také rozhraní AndroidInjector má v sobě metodu inject(). Můžeme tedy odstranit metodu inject() a rozšířit naše rozhraní AppComponent z AndroidInjector<Application>

Takže naše aktualizované a z kotle zredukované rozhraní AppComponent bude vypadat takto

Uvědomili jste si, že jsme změnili i naše moduly. V modulech komponent jsem odstranil třídu AndroidInjectionModule.class a přidal jsem třídu AndroidSupportInjectionModule.class. Ta je přidána proto, že jsme použili podporu Fragment. AndroidInjectionModule váže váš app.Fragment na dagger. Ale pokud chcete používat injection ve v4.fragment, pak byste měli přidat AndroidSupportInjectionModule.class do modulů vaší AppComponent.

Změnili jsme způsob, jakým injektujeme do naší AppComponent. Podívejme se tedy, co se změnilo v naší třídě Application.

Stejně jako v DaggerActivity a DaggerFragment musíme i naši třídu Application rozšířit z DaggerApplication.

Naše třída Application vypadala takto;

změnili jsme ji na..

Source

Tuto zjednodušenou implementaci najdete jako větev na mé stránce github. Nesloučím ji do masteru, protože chci v každé větvi ukázat oldschoolový způsob použití dýky. Takže čtenáři mohou sledovat cestu od oldschoolového způsobu ke zjednodušenému způsobu.

PS.

Leave a Reply