Új Android Injektor tőrrel 2 – 3. rész
Ha nem olvastad az 1. és 2. részt, javaslom, hogy először azokat olvasd el. A linkeket az alján találod.
TLDR;
A DaggerActivity, DaggerFragment, DaggerApplication használatával csökkentheted a boilerplate-ot az Activity/Fragment/Application-ben.
Az AndroidInjector<T>-t is használhatja a dagger komponenseiben, hogy szintén csökkentse a boilerplate-et.
Emlékezzünk arra, hogy az AndroidInjection.inject()-t hívjuk minden olyan activity vagy fragment esetében, amelynél dagger-t akartunk használni. És azt is, Ha Injectiont akarsz használni a fragmentumodban, akkor a HasSupportFragmentInject interfészt is implementálnod kell, és felül kell írnod a fragmentum injektort az aktivitásodban.
Most, ezt a kódot áthelyeztem az alap aktivitásomba és az alap fragmentumba. Miért kell ezt minden egyes aktivitásnál deklarálnom? Szerintem az alaposztályba való áthelyezésük elfogadható.
Azután a dagger projektben látok néhány osztályt a kutatás során, DaggerAppCompatActivity és DaggerFragment. Ezek az osztályok pontosan azt csinálják, amit én csináltam. Android szereti az öröklődést. Tehát úgy tehetünk, mintha mi is szeretnénk 😛
Lássuk, mi történik ezekben a könyvtári osztályokban.
Nem történik semmi különös valójában. Csökkenthetjük a boilerplate kódot a tevékenységünkben, ha kiterjesztjük a tevékenységünket a DaggerAppCompatActivity-ből.
A DetailActivity osztályunk a következő volt;
Hosszabbítsuk ki a DaggerAppCompatActivity-ből, és távolítsuk el a HasSupportFragmentInjector és overrided metódust a tevékenységünkből.
Most már jobb.
DaggerApplication, AndroidInjector, AndroidSupportInjectionModule
Lássuk, mit tehetünk még a boilerplate kód csökkentése érdekében. Az AndroidInjector segítségével leegyszerűsíthetjük az alkalmazáskomponensünket. Az AndroidInjector dokumentációját itt nézheti meg.
Lássuk az alkalmazáskomponensünket és az alkalmazás osztályunkat.
build() és seedInstance() már definiálva van az AndroidInjector.Builder osztályban. Tehát megszabadulhatunk tőlük, és kiterjeszthetjük a Builderünket az AndroidInjection.Builder<Application>-ből.
Az AndroidInjector interfészben is van inject() metódus. Tehát eltávolíthatjuk az inject() metódust, és kibővíthetjük az AppComponent interfészünket az AndroidInjector<Application>
Így a frissített és boilerplate-csökkentett AppComponent interfészünk a következőképpen fog kinézni
Felfogtad, hogy a moduljainkat is megváltoztattuk. A komponensmodulokból eltávolítottam az AndroidInjectionModule.class-t, és hozzáadtam az AndroidSupportInjectionModule.class-t. Ezt azért adtuk hozzá, mert support Fragmentet használtunk. AndroidInjectionModule köti az app.Fragmentet a daggerhez. De ha injektálást szeretne használni a v4.fragmentben, akkor hozzá kell adnia az AndroidSupportInjectionModule.class-t az AppComponent moduljaihoz.
Megváltoztattuk az injektálás módját az AppComponentünkbe. Lássuk tehát, mi változott az Application osztályunkban.
Mint ahogy a DaggerActivity és DaggerFragment esetében, úgy a DaggerApplicationből is ki kell bővítenünk az Application osztályunkat.
Az Application osztályunk a következőképpen nézett ki;
Megváltoztattuk..
Source
Ezt az egyszerűsített implementációt ágként megtalálod a github oldalamon. Ezt nem olvasztom be a masterbe, mert minden ágban meg akarom mutatni a tőr használatának régimódi módját. Így az olvasók követhetik az utat a régi iskola útjától az egyszerűsített útig.
Leave a Reply