Çoklu modül projesinde Dagger2'den Hilt'e geçiş

May 10 2023
Çok modüllü bir projede Dagger'dan Hilt'e geçiş için adım adım kılavuz. Proje Yapısı Projeyi görselleştirmek için NetworkModule, StorageModule, CommonModule, FeatureModule vb. birden çok modül içerir.

DaggerÇok modüllü bir projede geçiş yapmak için adım adım kılavuz Hilt.

Unsplash'ta Saif71.com tarafından fotoğraf

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
  • 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

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"
        }
    }
}

Uygulama Sınıfını 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 desteklemektir .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.

Etkinlik Sınıfını Taşı

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

  1. @ContributesAndroidInjectorBir modül olması muhtemel olan Fragment'inize açıklama eklediğiniz kodu kaldırın.
  2. Parçanız için SingletonComponentişlenen Modülü Kaldır@ContributesAndroidInjector
  3. Fragmanınıza açıklama ekleyin@AndroidEntryPoint
  4. 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şıyın.

Ş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

  1. Modülün dosyasına Hiltbağımlılık ekleyinbuild.gradle
  2. @ModuleHer birine ek açıklama ekleyin @InstallIn.
  3. Artık gerekli olmadığı için, varsa @JvmStaticher ek açıklama için ek açıklamayı kaldırın .@ProvideHilt
  4. Fragment/ Activityİle açıklama ekleyin @AndroidEntryPointve karşılık gelenleri kaldırın@ContributesAndroidInjector
  5. Açıklamalı ViewModels'inizi geçirin ve bu görünüm Modellerini enjekte etmek için @HiltViewModelparça uzantısını kullanınviewModels()
  6. 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

  1. 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
  2. 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 ve Çıkarımlar

Geçişten sonraki kod değişikliklerine ilişkin üst düzey genel bakış şu şekilde görünür:

  1. Tüm kod ek açıklamaları @Component/ @Component.Builder/ @Component.Factory/ @ContributesAndroidInjector/ @ViewModelKeykaldırılırdı
  2. Tüm ViewModel'lerinize açıklama eklenmelidir.@HiltViewModel
  3. Tüm sınıflar ek açıklama @Moduleile açıklamalı olmalıdır@InstallIn
  4. Parçalar/Etkinlikler/Görünüm/Hizmet ile açıklama eklenmelidir@AndroidEntryPoint
  5. Uygulama sınıfı ile açıklamalı olmalıdır@HiltAndroidApp
  6. AppComponentve ilgili kod kaldırılmalıdır
  7. @JvmStaticHilt 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