Çoklu modül projesinde Dagger2'den Hilt'e geçiş
Dagger
Çok modüllü bir projede geçiş yapmak için adım adım kılavuz Hilt
.
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 Hilt
geç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.app
Hilt
Dagger
Hilt
Versiyonlar
Dagger 2.24
Bu 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
- Uygulama sınıfını taşı
- Etkinlik sınıfını taşı
- Parçayı Taşı
- ViewModel'i Taşı
- Geçiş Sonrası Temizleme
- Özet ve Çıkarımlar
Hilt
Aşağıdaki bağımlılıkları App Gradle'ın dosyasına build.gradle
entegre etmek için
Ayrıca, correctErrorType'ı dosyada olarak kapt
ayarlamak için yapılandırıntrue
build.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
Component
uygulamada oluşturulan tüm Dagger modüllerini veya projenin diğer modüllerini içerir ve bu AppComponent
normalde 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
Component
yü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 .SingletonComponent
Hilt
@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 Hilt
bulmaya ç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.@InstallIn
AggregatedModule
@Module
Hilt
@Install
@InstallIn
-Adagger.hilt.disableModulesHaveInstallInCheck=true
.
uygulama düzeyinde aşağıdaki gibi belirtebilirsiniz, build.gradle
ancak 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"
}
}
}
Uygulama Sınıfını Taşı
Hilt'i uygulamaya eklemek için Application
sınıfa @HiltAndroidApp
. Yukarıda bahsedildiği gibi sınıfta mevcut olan @Component
ve @Component.Builder
olanları çıkarmalısınız .AppComponent
Uzatırsanız veya uygularsanız, Application
her 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 desteklemektir .DaggerApplication
HasAndroidInjector
Dagger
Hilt
Application
Uygulama sınıfınızdan uzantılarınız böyle DaggerApplication
görünecek.
Ve eğer uygularsanız Application
, HasAndroidInjector
uygulamanı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 Application
ve Application
aş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.
Etkinlik Sınıfını Taşı
Dagger, içinde yer alan modüllerden birinde @ContributesAndroidInjector
yapılan projemizde, Android Injector için herhangi bir Activity/Fragment katılımcısı olarak belirtmeyi sağlar.MainActivityModule
AggregatedModule
MainActivityModule
geçişten önce böyle görünüyor
MainActivity
geçişten önce böyle görünüyor
MainActivity
to ' muzu geçirmek için , modül sınıfından Hilt
tamamen 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
@AndroidEntryPoint
MainActivity
MainActivity
DaggerAppCompatActivity
AppCompatActivity
MainActivity
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 Hilt
geçiş için yaptığımız aynı adımlarla yapılacaktır . MainActivity
Adımlar aşağıdadır
@ContributesAndroidInjector
Bir modül olması muhtemel olan Fragment'inize açıklama eklediğiniz kodu kaldırın.- Parçanız için
SingletonComponent
iş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
DaggerFragment
geniş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 Hilt
fragman 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
, @IntoMap
ve @ViewModelKey
bağ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 var
olacak mülkümüz de olurdu , böylece Dagger'da hala başka bir ViewModel/Fragment yoksa ilgili kodu ve ilgili kodu silebilirsiniz .injected
ViewModelFactory
ViewModelModule
ViewModelProviderFactory
Fragment and ViewModel
Başarılı olması gereken projenizi çalıştırın Hilt
Diğer Modülleri Taşıyın.
Şimdiye kadar uygulama modülünde Components
/ Modules
/ Activity
/ taşıyorduk . Fragment
Ancak ş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
Hilt
bağımlılık ekleyinbuild.gradle
@Module
Her birine ek açıklama ekleyin@InstallIn
.- Artık gerekli olmadığı için, varsa
@JvmStatic
her ek açıklama için ek açıklamayı kaldırın .@Provide
Hilt
Fragment
/Activity
İle açıklama ekleyin@AndroidEntryPoint
ve 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
@HiltViewModel
parça uzantısını kullanınviewModels()
- NET'te artık gerekli olmayacak tüm Modülleri kaldırmaya devam edin
AggregatedModule
.AggregatedModule
yukarı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.gradle
ve@DisableInstallInCheck
herhangi bir ek açıklama eklendiyse kaldırın@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
Dagger
4. 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 ve Çıkarımlar
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
/@ViewModelKey
kaldırılırdı - Tüm ViewModel'lerinize açıklama eklenmelidir.
@HiltViewModel
- Tüm sınıflar ek açıklama
@Module
ile 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
AppComponent
ve ilgili kod kaldırılmalıdır@JvmStatic
Hilt modülleri içindeki ek açıklamalar artık mevcut olmamalıdır
- Hilt kullanarak Bağımlılık Enjeksiyonu
- Resmi Hilt Belgelerine Geçiş
Takip etmeyi ve beğendiyseniz unutmayın :)
— — — — — — — — — — —
GitHub | LinkedIn | twitter
Seviye Atlama Kodlama
Topluluğumuzun bir parçası olduğunuz için teşekkürler! Gitmeden önce:
- Hikaye için alkışlayın ve yazarı takip edin
- Seviye Atlama Kodlama yayınında daha fazla içerik görüntüleyin
- Ücretsiz kodlama mülakat kursu ⇒ Kursu Görüntüle
- Bizi takip edin: Twitter | LinkedIn | Bülten