Jak używać sztyletu? Jak skonfigurować Dagger do pracy w moim projekcie na Androida?
Chciałbym użyć Daggera w moim projekcie na Androida, ale wydaje mi się to zagmatwane.
EDYCJA: Dagger2 jest również dostępny od 15.04.2015 r. I jest jeszcze bardziej zagmatwany!
[To pytanie jest „odgałęzieniem”, na którym dodaję do mojej odpowiedzi, gdy dowiaduję się więcej o Dagger1 i dowiaduję się więcej o Dagger2. To pytanie jest raczej przewodnikiem niż „pytaniem”.]
android
dependency-injection
dagger
dagger-2
EpicPandaForce
źródło
źródło
ViewModel
iPageKeyedDataSource
? Tak jak używam RxJava2 i chcę, aby CompositeDisposable było współdzielone przez obie klasy, a jeśli użytkownik naciśnie przycisk Wstecz, chcę wyczyścić obiekt Disposable. Dodałem tutaj przypadek: stackoverflow.com/questions/62595956/ ...ViewModel
i być może przekazać ten sam argument compositeDisposable jako konstruktora Twojego niestandardowego PageKeyedDataSource, ale tak naprawdę nie użyłbym Daggera do tej części, ponieważ wtedy potrzebujesz podkomponentów podrzędnych, a Hilt tak naprawdę nie będzie wspierać tego Łatwe dla Ciebie.Odpowiedzi:
Przewodnik po Dagger 2.x (poprawiona edycja 6) :
Kroki są następujące:
1.) dodaj
Dagger
do swoichbuild.gradle
plików:.
.
2.) Utwórz
AppContextModule
klasę, która zawiera zależności.3.) Utwórz
AppContextComponent
klasę udostępniającą interfejs do pobierania klas, które można wstrzyknąć.3.1.) Oto jak stworzyłbyś moduł z implementacją:
Uwaga: Musisz podać
@Scope
adnotację (taką jak@Singleton
lub@ActivityScope
) w@Provides
metodzie z adnotacjami modułu, aby uzyskać zakres dostawcy w wygenerowanym komponencie, w przeciwnym razie będzie on bez zakresu i za każdym razem otrzymasz nową instancję.3.2.) Utwórz komponent o zasięgu aplikacji, który określa, co możesz wstrzyknąć (jest to to samo, co
injects={MainActivity.class}
w Dagger 1.x):3.3.) W przypadku zależności, które możesz samodzielnie utworzyć za pomocą konstruktora i nie chcesz ich przedefiniować za pomocą
@Module
(na przykład, zamiast tego używasz smaków kompilacji, aby zmienić typ implementacji), możesz użyć@Inject
konstruktora z adnotacjami.Ponadto, jeśli używasz
@Inject
konstruktora, możesz użyć iniekcji pola bez konieczności jawnego wywoływaniacomponent.inject(this)
:Te
@Inject
klasy konstruktorów są automatycznie dodawane do składnika o tym samym zakresie bez konieczności jawnego określania ich w module.@Singleton
Scoped@Inject
klasy konstruktor będzie można zobaczyć w@Singleton
scoped komponentów.3.4.) Po zdefiniowaniu konkretnej implementacji dla danego interfejsu, na przykład:
Będziesz musiał „powiązać” konkretną implementację z interfejsem za pomocą pliku
@Module
.Krótka ręka na to od Daggera 2.4 jest następująca:
4.) utwórz
Injector
klasę do obsługi komponentu na poziomie aplikacji (zastępuje monolitObjectGraph
)(uwaga:
Rebuild Project
aby utworzyćDaggerApplicationComponent
klasę konstruktora za pomocą APT)5.) stwórz swoją
CustomApplication
klasę6.) dodaj
CustomApplication
do swojegoAndroidManifest.xml
.7.) Wstrzyknij swoje zajęcia w formacie
MainActivity
8.) Ciesz się!
+1.) Możesz określić
Scope
dla swoich komponentów, za pomocą których możesz tworzyć komponenty o zakresie na poziomie działania . Podzakresy pozwalają na zapewnienie zależności, których potrzebujesz tylko dla danego zakresu, a nie w całej aplikacji. Zazwyczaj każde działanie otrzymuje swój własny moduł w tej konfiguracji. Należy pamiętać, że dla każdego komponentu istnieje dostawca w zakresie , co oznacza, że aby zachować instancję dla tego działania, sam komponent musi przetrwać zmianę konfiguracji. Na przykład może przetrwaćonRetainCustomNonConfigurationInstance()
lub przez lunetę z moździerza.Aby uzyskać więcej informacji na temat subscopingu, zapoznaj się z przewodnikiem Google . Proszę również odwiedzić tę witrynę o metodach udostępniania, a także sekcję dotyczącą zależności komponentów ) oraz tutaj .
Aby utworzyć zakres niestandardowy, musisz określić adnotację kwalifikatora zakresu:
Aby utworzyć zakres podrzędny, musisz określić zakres w swoim komponencie i określić
ApplicationComponent
jako jego zależność. Oczywiście musisz również określić zakres podrzędny w metodach dostawcy modułów.I
Należy pamiętać, że jako zależność można określić tylko jeden składnik o określonym zakresie. Pomyśl o tym dokładnie tak, jak o tym, że dziedziczenie wielokrotne nie jest obsługiwane w Javie.
+2.) O
@Subcomponent
: zasadniczo zakres@Subcomponent
może zastąpić zależność komponentu; ale zamiast korzystać z konstruktora dostarczonego przez procesor adnotacji, należałoby użyć metody fabryki komponentów.Więc to:
Staje się tym:
I to:
Staje się tym:
+3.): Sprawdź również inne pytania dotyczące przepełnienia stosu dotyczące Daggera2, zawierają one wiele informacji. Na przykład moja obecna struktura Dagger2 jest określona w tej odpowiedzi .
Dzięki
Dziękuję za przewodniki w Github , TutsPlus , Joe Steele , Froger MCS i Google .
Również w przypadku tego przewodnika migracji krok po kroku, który znalazłem po napisaniu tego posta.
I dla wyjaśnienia zakresu przez Kirilla.
Jeszcze więcej informacji w oficjalnej dokumentacji .
źródło
DaggerApplicationComponent
jest automatycznie generowany przez APT podczas kompilacji, ale dodam go.Poradnik do Dagger 1.x :
Kroki są następujące:
1.) dodaj
Dagger
dobuild.gradle
pliku zależnościDodaj także,
packaging-option
aby uniknąć błędu dotyczącegoduplicate APKs
.2.) Utwórz
Injector
klasę do obsługiObjectGraph
.3.) Utwórz,
RootModule
aby połączyć ze sobą przyszłe moduły. Pamiętaj, że musiszinjects
podać każdą klasę, w której będziesz używać@Inject
adnotacji, ponieważ w przeciwnym razie rzuca DaggerRuntimeException
.4.) W przypadku, gdy masz inne podmoduły w swoich modułach określonych w katalogu głównym, utwórz moduły dla tych:
5.) stworzyć moduły-liście, które otrzymają zależności jako parametry konstruktora. W moim przypadku nie było zależności cyklicznej, więc nie wiem, czy Dagger może to rozwiązać, ale wydaje mi się to mało prawdopodobne. Parametry konstruktora muszą być również podane w Module przez Dagger, jeśli określisz
complete = false
, mogą być również w innych modułach.6.) Rozszerz
Application
i zainicjuj plikInjector
.7.) W swoim
MainActivity
, wywołaj Injector wonCreate()
metodzie.8.) Użyj
@Inject
w swoimMainActivity
.Jeśli pojawi się błąd
no injectable constructor found
, upewnij się, że nie zapomniałeś@Provides
adnotacji.źródło
Android Bootstrap
. Więc chwała im za to, że to zrozumieli. Rozwiązanie wykorzystujeDagger v1.2.2
.dagger-compiler
powinien byćprovided
inaczej zostanie on włączony do aplikacji, a to na podstawie licencji GPL.