Ako se bavite razvojem Android aplikacija, vjerojatno ste se susreli s potrebom za boljom organizacijom nastave kako biste spriječili da projekt upadne u potpuni kaos. Tu se pojavljuje... injekcija ovisnosti, dizajnerski uzorak koji, iako se u početku može činiti kao crna magija, u osnovi je način da se svakoj klasi daju objekti koji su joj potrebni bez da ih klasa mora sama proizvoditi.
Hilt stiže da nas spasi od složenosti Daggera, nudeći gornji sloj koji standardizira umetanje ovisnostiIntegracijom s Jetpackom, Hilt automatski upravlja kontejnerima i životnim ciklusima, što nam omogućuje da se usredotočimo na poslovnu logiku umjesto na premještanje objekata kao da se selimo.
Početna konfiguracija okruženja
Za početak korištenja Hilta, prvo je potrebno pripremiti teren u Gradleu. Bitno je dodati dodatak za hilt-android-gradle u datoteci na razini projekta. Zatim, u datoteci modula aplikacije, moramo primijeniti dodatak i dodati odgovarajuće ovisnosti, pazeći da je kompajler (bilo pomoću kapt ili KSP) ispravno konfiguriran.
Jedan detalj koji ne smijemo previdjeti jest da, kako bi sve glatko teklo, projekt mora biti konfiguriran za korištenje Java 17 (ili Java 8 u starijim verzijama), jer je to bitan zahtjev za Hilt i Jetpack Compose rade u skladu. Ako primijetite da se program ne kompajlira kada aktivirate dodatak, provjerite podudaraju li se verzije Kotlina i KSP-a točno, jer čak i mala razlika može prekinuti cijeli proces kompajliranja.
Srce Hilta: Klasa primjene
Svaka aplikacija koja želi koristiti ovu biblioteku mora imati prilagođenu klasu Application. Nije dovoljno samo je stvoriti; moramo je i označiti anotacijom. @HiltAndroidAppOva linija pokreće Hiltovo generiranje koda i stvara korijenski kontejner aplikacije.
Ova glavna komponenta je ključna jer je povezana s cjelokupnim životnim ciklusom aplikacije i služi kao temelj za sve ostale komponente Mogu pristupiti ovisnostima definiranim na ovoj razini. Naravno, ne zaboravite registrirati ovu klasu u datoteci AndroidManifest.xml pomoću atributa name, inače će Hilt proći potpuno nezapaženo.
Ubrizgavanje ovisnosti u Android komponente
Nakon što je aplikacija spremna, možemo početi ubrizgavati ovisnosti u aktivnosti, fragmente, prikaze ili usluge. Da bismo to postigli, koristimo anotaciju @AndroidEntryPointOvo govori Hiltu da je ova klasa ulazna točka i da bi za nju trebao generirati specifičnu komponentu.
Kada želimo dobiti određenu ovisnost unutar aktivnosti, koristimo injekcija u polje pomoću anotacije @Inject. Vrlo je važno zapamtiti da Ova polja ne mogu biti privatna.Ako pokušate koristiti modifikator `private`, kompajler će bez oklijevanja izbaciti grešku. U slučaju Jetpack Compose-a, jednostavno označavanje korijenske aktivnosti omogućuje vam izravan pristup ViewModelima unutar kompozibilnih funkcija.
Strategije za definiranje veza
Hilt mora znati kako proizvesti predmete koje tražimo. Najizravniji način je... injekcija graditeljagdje smo stavili @Inject neposredno prije konstruktora klase. Na taj način Hilt analizira parametre i pronalazi kako osigurati svaku od tih ovisnosti.
Ali naravno, postoje slučajevi kada nemamo potpunu kontrolu nad klasom, kao na primjer kada koristimo vanjske biblioteke poput Retrofita ili OkHttpClienta. Za to imamo... Moduli drškeModul je klasa označena s @Module i mora uključivati @InstallIn kako bi se naznačilo koja komponenta treba imati tu ovisnost.
- Korištenje @Provides: Ovo se koristi kada je klasa treće strane ili zahtijeva složeni obrazac konstrukcije. Ovdje definiramo funkciju koja vraća potrebnu instancu.
- Korištenje @Binds: Ovo je idealna opcija kada želimo povezati sučelje s konkretnom implementacijom. Definira se kao apstraktna funkcija koja Hilt-u govori: "kada netko zatraži ovo sučelje, dajte mu ovu implementaciju."
Upravljanje opsegom i životnim ciklusom
Prema zadanim postavkama, Hilt stvara novu instancu svaki put kada se zatraži ovisnost. Međutim, ponekad nam je potreban objekt koji ostaje isti tijekom cijelog životnog vijeka aplikacije ili zaslona. Za to koristimo... opseg komponenti.
Ako označimo klasu sa @Singleton A ako ga instaliramo u SingletonComponent, imat ćemo jednu globalnu instancu. Ako želimo da objekt postoji samo za vrijeme trajanja aktivnosti, koristimo @ActivityScoped unutar ActivityComponent. Ključno je ne prekomjerno koristiti opseg, jer predugo držanje objekata u memoriji može u konačnici utjecati na performanse aplikacije.
Posebni slučajevi i kvalifikatori
Ponekad trebamo ubrizgati dvije različite implementacije istog sučelja. Kako bismo izbjegli preopterećenje kompajlera, koristimo kvalifikantiKvalifikator je u osnovi prilagođena anotacija koja se koristi za označavanje određenog povezivanja, što nam omogućuje razlikovanje, na primjer, između HTTP klijenta za autentifikaciju i onog za opće zahtjeve.
Nadalje, Hilt nam olakšava život unaprijed definiranim kvalifikatorima kao što su @ApplicationContext i @ActivityContext, koji nam omogućuju dobivanje Android konteksta bez potrebe za ručnim konfiguriranjem modula za njega. Konačno, za one klase koje Hilt izvorno ne podržava (kao što su ContentProviders), možemo koristiti anotaciju @UlaznaTočka, stvarajući ručni most za izdvajanje ovisnosti iz Hilt grafa. Podijelite informacije i više korisnika će saznati više o toj temi.