Nowy Android Injector z Dagger 2 – część 3

Jeśli nie czytałeś części 1 i 2, sugeruję abyś przeczytał je najpierw. Możesz znaleźć linki na dole.

TLDR;

Możesz użyć DaggerActivity, DaggerFragment, DaggerApplication aby zredukować boilerplate w twoim Activity/Fragment/Application.

Możesz również użyć AndroidInjector<T> w swoich komponentach dagger, aby zmniejszyć boilerplate too.

Pamiętaj, że nazywamy AndroidInjection.inject() każdą aktywność lub fragment, który chcieliśmy użyć dagger. A także, Jeśli chcesz użyć Injection w swoim fragmencie, powinieneś również zaimplementować interfejs HasSupportFragmentInject i nadpisać fragment injector w swojej aktywności.

Ostatnio przeniosłem ten kod do mojej aktywności bazowej i fragmentu bazowego. Dlaczego miałbym potrzebować zadeklarować to dla każdej pojedynczej aktywności? Myślę, że przeniesienie ich do klasy bazowej jest do przyjęcia.

Potem widzę kilka klas w projekcie dagger podczas badań, DaggerAppCompatActivity i DaggerFragment. Te klasy robią dokładnie to, co ja zrobiłem. Android kocha dziedziczenie. Więc możemy udawać, że my też to uwielbiamy 😛

Zobaczmy co się dzieje wewnątrz tych klas bibliotecznych.

DaggerAppCompatActivity

Właściwie nic się nie różni. Możemy zredukować kod boilerplate w naszej aktywności poprzez rozszerzenie naszej aktywności z DaggerAppCompatActivity.

Nasza klasa DetailActivity była jak poniżej;

Rozszerzmy ją z DaggerAppCompatActivity i usuńmy HasSupportFragmentInjector i nadrzędną metodę z naszej aktywności.

Teraz jest już lepiej.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

Zobaczmy, co jeszcze możemy zrobić, aby zredukować kod boilerplate. AndroidInjector pomaga nam uprościć nasz komponent aplikacji. Możesz sprawdzić dokumentację AndroidInjector stąd.

Zobaczmy nasz komponent aplikacji i klasę aplikacji.

build() i seedInstance() są już zdefiniowane w klasie AndroidInjector.Builder. Możemy więc się ich pozbyć i rozszerzyć nasz Builder z AndroidInjection.Builder<Application>.

I również, interfejs AndroidInjector ma w sobie metodę inject(). Tak więc możemy usunąć metodę inject() i rozszerzyć nasz interfejs AppComponent z AndroidInjector<Application>

Więc, nasz zaktualizowany i zredukowany o boilerplate interfejs AppComponent będzie wyglądał jak poniżej

Czy zdajesz sobie sprawę, że zmieniliśmy również nasze moduły. Usunąłem AndroidInjectionModule.class w modułach komponentów i dodałem AndroidSupportInjectionModule.class. Jest ona dodana, ponieważ używaliśmy supportu Fragmentu. AndroidInjectionModule wiąże twoją app.Fragment do dagger. Ale jeśli chcesz używać iniekcji w v4.fragment to powinieneś dodać AndroidSupportInjectionModule.class do swoich modułów AppComponent.

Zmieniliśmy sposób w jaki wstrzykujemy do naszego AppComponent. Zobaczmy więc co zostało zmienione w naszej klasie Application.

Tak jak w DaggerActivity i DaggerFragment, musimy również rozszerzyć naszą klasę Application z DaggerApplication.

Nasza klasa Application wyglądała jak poniżej;

Zmieniliśmy ją na..

Source

Możesz znaleźć tę uproszczoną implementację jako gałąź na mojej stronie github. Nie łączę tego z masterem, ponieważ chcę pokazać stary szkolny sposób używania daggera w każdym oddziale. Więc czytelnicy mogą podążać drogą od oldschoolowego sposobu do uproszczonego sposobu.

PS.

Leave a Reply