Jei kuriate „Android“ programas, tikriausiai susidūrėte su poreikiu geriau organizuoti savo klases, kad projektas nepavirstų visišku chaosu. Čia praverčia priklausomybių injekcija – projektavimo šablonas, kuris, nors iš pradžių gali atrodyti kaip juodoji magija, iš esmės yra būdas kiekvienai klasei suteikti reikiamus objektus, nereikalaujant jų kurti pačiai klasei.
„Hilt“ atvyksta išgelbėti mūsų nuo „Dagger“ sudėtingumo, siūlydama viršutinį sluoksnį, kuris standartizuoja priklausomybių įterpimą . Integruodamasi su „Jetpack“, „Hilt“ automatiškai valdo konteinerius ir gyvavimo ciklus, leisdama mums sutelkti dėmesį į verslo logiką, o ne į objektų perkėlimą, tarsi kraustytumėmės.
Pradinė aplinkos konfigūracija
Norėdami pradėti dirbti su „Hilt“, pirmiausia turite paruošti „Gradle“ aplinką. Svarbu pridėti „ hilt-android-gradle-plugin“ prie projekto lygio konfigūracijos failo. Tada savo programos modulio faile turite pritaikyti papildinį ir pridėti atitinkamas priklausomybes, užtikrindami, kad kompiliatorius (nesvarbu, ar naudojamas „kapt“, ar „KSP“) būtų teisingai sukonfigūruotas.
Viena esminė detalė yra ta, kad viskas sklandžiai veiktų, projektas turi būti sukonfigūruotas naudoti „Java 17“ (arba „Java 8“, jei naudojamos senesnės versijos), nes tai yra būtina sąlyga, kad „Hilt“ ir „Jetpack Compose“ sklandžiai veiktų kartu. Jei pastebite, kad programa nekompiliuojasi aktyvavus įskiepį, dar kartą patikrinkite, ar „Kotlin“ ir KSP versijos tiksliai sutampa, nes net ir nedidelis neatitikimas gali sutrikdyti visą kompiliavimo procesą.
„Hilt“ esmė: taikymo klasė
Bet kuri programa, norinti pasinaudoti šia biblioteka, turi turėti pasirinktinę programos klasę. Vien jos sukūrimo nepakanka; ji turi būti pažymėta anotacija „@HiltAndroidApp“ . Ši eilutė inicijuoja „Hilt“ kodo generavimą ir sukuria programos šakninį konteinerį.
Šis aukščiausio lygio komponentas yra gyvybiškai svarbus, nes jis yra susijęs su bendru programos gyvavimo ciklu ir yra pagrindas visiems kitiems komponentams, norintiems pasiekti šiame lygmenyje apibrėžtas priklausomybes. Žinoma, nepamirškite užregistruoti šios klasės faile „AndroidManifest.xml“ naudojant „name“ atributą, kitaip „Hilt“ liks visiškai nepastebėtas.
Priklausomybių įterpimas į „Android“ komponentus
Kai programa bus paruošta, galėsime pradėti įterpti priklausomybes į veiklas, fragmentus, rodinius ar paslaugas. Tam naudosime anotaciją @AndroidEntryPoint . Tai nurodo „Hilti“, kad ši klasė yra įėjimo taškas ir kad ji turėtų sugeneruoti jai konkretų komponentą.
Kai norime gauti konkrečią priklausomybę veiklos viduje, naudojame lauko injekciją per @Inject anotaciją. Labai svarbu atsiminti, kad šie laukai negali būti privatūs ; jei bandysite naudoti privatų modifikatorių, kompiliatorius nedvejodamas pateiks klaidą. „Jetpack Compose“ atveju, tiesiog anotuojant pagrindinę veiklą, galime pasiekti „ViewModels“ tiesiogiai komponuojamose funkcijose.
Ryšių apibrėžimo strategijos
„Hilt“ turi žinoti, kaip sukurti prašomus objektus. Tiesiausias būdas yra konstruktoriaus injekcija , kai `@Inject` dedame prieš pat klasės konstruktorių. Tai leidžia „Hilt“ analizuoti parametrus ir nustatyti, kaip pateikti kiekvieną iš šių priklausomybių.
Tačiau pasitaiko atvejų, kai mes neturime visiškos klasės kontrolės, pavyzdžiui, kai naudojamos išorinės bibliotekos, tokios kaip „Retrofit“ arba „OkHttpClient“. Čia praverčia „Hilt“ moduliai . Modulis yra klasė, pažymėta @Module ir jame turi būti @InstallIn, kad būtų nurodyta, kuris komponentas turėtų talpinti tą priklausomybę.
- „@Provides“ naudojimas: Tai naudojama, kai klasė yra trečiosios šalies arba jai reikalingas sudėtingas konstrukcijos modelis. Čia apibrėžiame funkciją, kuri grąžina reikiamą egzempliorių.
- Naudojant @Binds: Tai idealus variantas, kai norime susieti sąsają su konkrečiu įgyvendinimu. Tai apibrėžiama kaip abstrakti funkcija, kuri nurodo Hiltui: „kai kas nors paprašys šios sąsajos, duokite jam šį įgyvendinimą“.
Apimties ir gyvavimo ciklo valdymas
Pagal numatytuosius nustatymus „Hilt“ sukuria naują egzempliorių kiekvieną kartą, kai pateikiama priklausomybės užklausa. Tačiau kartais reikia, kad objektas išliktų toks pats visą programos ar ekrano gyvavimo laiką. Tam naudojame komponentų sritis.
Jei pažymėsime klasę @Singleton ir įdiegsime ją į „SingletonComponent“, turėsime vieną globalų egzempliorių. Jei norime, kad objektas egzistuotų tik veiklos metu, „ActivityComponent“ viduje naudosime @ActivityScoped . Labai svarbu neper daug naudoti taikymo sričių, nes per ilgas objektų laikymas atmintyje gali neigiamai paveikti programos našumą.
Specialūs atvejai ir kvalifikatoriai
Kartais reikia įdiegti dvi skirtingas tos pačios sąsajos implementacijas. Kad neperkrautume kompiliatoriaus, naudojame kvalifikatorius . Kvalifikatorius iš esmės yra pasirinktinė anotacija, naudojama konkrečiam susiejimui žymėti, leidžianti, pavyzdžiui, atskirti HTTP klientą autentifikavimui nuo kliento bendroms užklausoms.
Be to, „Hilt“ supaprastina procesą naudodama iš anksto apibrėžtus kvalifikatorius, tokius kaip „@ApplicationContext“ ir „@ActivityContext“, kurie leidžia gauti „Android“ kontekstą nereikalaujant rankiniu būdu konfigūruoti modulių. Galiausiai, klasėms, kurių „Hilt“ nepalaiko (pvz., „ContentProviders“), galime naudoti „ @EntryPoint“ anotaciją , sukurdami rankinį tiltą priklausomybėms išgauti iš „Hilt“ grafiko. Pasidalykite šia informacija, kad apie ją sužinotų daugiau vartotojų.