Çoklu modül projesinde Dagger'dan Hilt'e geçiş
Çok modüllü bir projede Daggergeçiş yapmak için adım adım kılavuzHilt
Proje Yapısı
Projeyi görselleştirmek için birden çok NetworkModule, StorageModule, CommonModule, FeatureModule vb.
Göç Stratejisi
Tamamen geçiş yapmak istiyoruz Dagger, ancak pratikte , projemizi önce diğer modüllere Hiltgeçireceğimiz artımlı bir yaklaşıma ihtiyacımız var , bu da tam geçiş tamamlanana kadar bir süre paralel olarak çalışması gerektiği anlamına gelir.appHiltDaggerHilt
Versiyonlar
Dagger 2.24Bu hikaye, ile arasında bir geçiş yapacak Hilt 2.45.
İçerik
- Yapılandırma/Hazırlık
- Uygulama Bileşenini ve Singleton'u Geçirin
- Uygulamayı Taşı
- Aktivite
- parça
- Modeli Görüntüle
- Geçiş Sonrası Temizleme
- Özet
HiltAşağıdaki bağımlılıkları App Gradle'ın dosyasına build.gradleentegre etmek için
Ayrıca, correctErrorType'ı dosyada olarak kaptayarlamak için yapılandırıntruebuild.gradle
dependencies {
implementation 'com.google.dagger:hilt-android:2.45'
kapt 'com.google.dagger:hilt-compiler:2.45'
}
// Allow references to generated code
kapt {
correctErrorTypes = true
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android' version '2.45' apply false
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android'
}
android {
....
}
Uygulama Bileşenini Taşı
Dagger, Singleton Componentuygulamada oluşturulan tüm Dagger modüllerini veya projenin diğer modüllerini içerir ve bu AppComponentnormalde Dagger.
Geçerli AppComponent.kt dosyasına bakalım
Taşımak için NetworkModule , StorageModule vb. gibi her bir modülü for içine Singleton Componentyüklememiz gerekir , bunu tüm bu modüllere açıklama ekleyerek yapabilirsiniz . ile açıklama eklenecek ve tüm bu modülleri içeren bir AggregatedModule oluşturun .SingletonComponentHilt@InstallIn(SingletonComponent::class)@InstallIn(SingletonComponent::class)Dagger@Module(includes = [ <all of these modules > ])
Projeyi çalıştırın, hata verecektir
DisableModuleHasInstallInCheck Hatası
Çalıştırdıktan sonra proje, ile açıklamalı olarak dahil edilen her modül için ek açıklama Hiltbulmaya çalışacaktır . ile açıklama eklenmemiş bir modül bulursa bir hata verir. Geçişin ortasında olduğumuz için her modüle açıklama eklemediğimiz için , aşağıdaki bayrağı kullanarak bu hatayı devre dışı bırakabiliriz.@InstallInAggregatedModule@ModuleHilt@Install@InstallIn
-Adagger.hilt.disableModulesHaveInstallInCheck=true.
uygulama düzeyinde aşağıdaki gibi belirtebilirsiniz, build.gradleancak tüm taşıma tamamlandıktan sonra bu bayrağı kaldırmalıyız.
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
Uygulamayı Taşı
Hilt'i uygulamaya eklemek için Applicationsınıfa @HiltAndroidApp. Yukarıda bahsedildiği gibi sınıfta mevcut olan @Componentve @Component.Builderolanları çıkarmalısınız .AppComponent
Uzatırsanız veya uygularsanız, Applicationher iki durumda da aşağıda gösterildiği gibi bazı kodları saklamanız gerekir. Bu , tüm geçiş tamamlanana kadar her ikisini de paralel olarak desteklemek içindir .DaggerApplicationHasAndroidInjectorDaggerHilt
ApplicationUygulama sınıfınızdan uzantılarınız böyle DaggerApplicationgörünecek.
Ve eğer uygularsanız Application, HasAndroidInjectoruygulamanız böyle görünmelidir.
Tüm geçiş tamamlandığında, bu tür kodu sınıfınızdan kaldırmanız gerekir Applicationve Applicationaşağıdaki gibi görünürsünüz. (Ama bu son adımlardan biri olur, lütfen şimdi yapma)
Projeyi çalıştırın, projenizi başarıyla oluşturmalı ve Uygulama, çalışma süresi istisnaları olmadan başlamalıdır.
Etkinliği Taşıma
Dagger, içinde yer alan modüllerden birinde @ContributesAndroidInjectoryapılan projemizde, Android Injector için herhangi bir Activity/Fragment katılımcısı olarak belirtmeyi sağlar.MainActivityModuleAggregatedModule
MainActivityModulegeçişten önce böyle görünüyor
MainActivitygeçişten önce böyle görünüyor
MainActivityto ' muzu geçirmek için , modül sınıfından Hilttamamen kurtulacağız ve için ek açıklama ekleyeceğiz . Bizimki de from'dan genişlediğinden, aktivitemizi karşılık gelenden genişletmemiz gerekiyor, bu nedenle taşımadan sonra aşağıdaki gibi görüneceğiz.MainActivityModule@AndroidEntryPointMainActivityMainActivityDaggerAppCompatActivityAppCompatActivityMainActivity
MainActivity Başarılı olması gereken projenizi çalıştırın Hilt
Parça/Görünüm/Yayın Alıcısını Taşı
Herhangi bir Fragment'in içine taşınması, Hilt'e Hiltgeçiş için yaptığımız aynı adımlarla yapılacaktır . MainActivityAdımlar aşağıdadır
@ContributesAndroidInjectorBir modül olması muhtemel olan Fragment'inize açıklama eklediğiniz kodu kaldırın.- Parçanız için
SingletonComponentişlenen Modülü Kaldır@ContributesAndroidInjector - Fragmanınıza açıklama ekleyin
@AndroidEntryPoint - parçanız uzatılırsa, parçanızı sınıftan
DaggerFragmentgenişletmeniz gerekirFragment
ViewModel'i Taşı
ViewModel'in taşınması bazı adımlar gerektirir.
Öncelikle viewModel'inize açıklama ekleyin@HiltViewModel
FeatureViewModelİçine enjekte edilmek için, aşağıdaki gibi ilgili dosyaya ekleyeceğimiz fragman uzantısı bağımlılığında sağlanan Hiltfragman uzantısını kullanacağız.viewModels()build.gradle
implementation "androidx.fragment:fragment-ktx:1.5.6"
Şimdi Dagger için kullandığımız karşılık gelen @Bind, @IntoMapve @ViewModelKeybağlamaları kaldırın .FeatureViewModel
Bir ViewModel enjekte etmek için hançerde ayrıca, artık gerekli olmayan bazılarını kullanarak çalışma zamanında lateinit varolacak mülkümüz de olurdu , böylece Dagger'da hala başka bir ViewModel/Fragment yoksa ilgili kodu ve ilgili kodu silebilirsiniz .injectedViewModelFactoryViewModelModuleViewModelProviderFactory
Fragment and ViewModel Başarılı olması gereken projenizi çalıştırın Hilt
Diğer Modülleri Taşı
Şimdiye kadar uygulama modülünde Components/ Modules/ Activity/ taşıyorduk . FragmentAncak şimdi diğer modülleri taşımamız gerekiyor, Her seferinde bir modüle gideceğiz ve aşağıdaki adımları kullanarak tamamen Hilt'e taşıyacağız
- Modülün dosyasına
Hiltbağımlılık ekleyinbuild.gradle @ModuleHer birine ek açıklama ekleyin@InstallIn.- Artık gerekli olmadığı için, varsa
@JvmStaticher ek açıklama için ek açıklamayı kaldırın .@ProvideHilt Fragment/Activityİle açıklama ekleyin@AndroidEntryPointve karşılık gelenleri kaldırın@ContributesAndroidInjector- Açıklamalı ViewModels'inizi geçirin ve bu görünüm Modellerini enjekte etmek için
@HiltViewModelparça uzantısını kullanınviewModels() - NET'te artık gerekli olmayacak tüm Modülleri kaldırmaya devam edin
AggregatedModule.AggregatedModuleyukarıda ilk adımda oluşturduk.
Her proje modülü Hilt. Temizleme süresi gerekiyor
- Başlangıçta uygulama düzeyinde veya başka herhangi bir düzeyde eklediğimiz disableModuleInstallInCheck = true'yu kaldırın
build.gradleve@DisableInstallInCheckherhangi bir ek açıklama eklendiyse kaldırın@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
Dagger4. Tüm modüllerinizdeki tüm bağımlılıkları kaldırın .
Projenizi çalıştırın, başarıyla çalıştırılmalıdır, projeniz tam olarak taşınmıştır Hilt
Özet
Geçişten sonraki kod değişikliklerine ilişkin üst düzey genel bakış şu şekilde görünür:
- Tüm kod ek açıklamaları
@Component/@Component.Builder/@Component.Factory/@ContributesAndroidInjector/@ViewModelKeykaldırılırdı - Tüm ViewModel'lerinize açıklama eklenmelidir.
@HiltViewModel - Tüm sınıflar ek açıklama
@Moduleile açıklamalı olmalıdır@InstallIn - Parçalar/Etkinlikler/Görünüm/Hizmet ile açıklama eklenmelidir
@AndroidEntryPoint - Uygulama sınıfı ile açıklamalı olmalıdır
@HiltAndroidApp AppComponentve ilgili kod kaldırılmalıdır@JvmStaticHilt modülleri içindeki ek açıklamalar artık mevcut olmamalıdır
Aşağıda belirtilen ayrı hikayeler yazdım
- Hilt kullanarak Testlerdeki bağlamalar nasıl değiştirilir?
- Hilt kullanarak Testler için konteyner Etkinliği nasıl oluşturulur?
kaynaklar
- Hilt kullanarak Bağımlılık Enjeksiyonu
- Resmi Hilt Belgelerine Geçiş
GitHub | LinkedIn | twitter

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































