Bermigrasi dari Dagger2 ke Hilt dalam project multi modul
Panduan langkah demi langkah untuk bermigrasi dari Dagger
ke Hilt
proyek multi modul.
Struktur Proyek
Untuk memvisualisasikan proyek, ini berisi beberapa modul NetworkModule, StorageModule, CommonModule, FeatureModule dll. Dalam proyek nyata mungkin ada lebih banyak modul tetapi kami membatasi modul berikut.
Strategi Migrasi
Kami ingin bermigrasi sepenuhnya Dagger
ke Hilt
tetapi dalam praktiknya kami memerlukan pendekatan tambahan di mana kami pertama-tama akan memigrasikan app
proyek kami ke Hilt
dan kemudian modul lain, itu berarti Dagger
dan Hilt
harus bekerja secara paralel untuk beberapa waktu hingga migrasi lengkap selesai.
Versi
Cerita ini akan melakukan migrasi dari Dagger 2.24
ke Hilt 2.45
.
Isi
- Konfigurasi/Persiapan
- Migrasikan Komponen Aplikasi dan Singleton
- Migrasi kelas Aplikasi
- Migrasi kelas Aktivitas
- Migrasi Fragmen
- Migrasikan ViewModel
- Pembersihan Pasca Migrasi
- Ringkasan dan Takeaways
Untuk mengintegrasikan, tambahkan dependensi berikut ke dalam file Hilt
app Gradlebuild.gradle
Konfigurasikan juga kapt
untuk menyetel correctErrorType ke true
dalam build.gradle
file
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 {
....
}
Migrasikan Komponen Aplikasi
Dagger memiliki Singleton
Component
yang menyertakan semua modul Dagger yang dibuat di aplikasi atau modul lain dari proyek dan itu biasanya dilakukan di AppComponent
kelas yang dibuat untuk Dagger
.
Mari kita lihat file AppComponent.kt saat ini
Untuk bermigrasi, Singleton
Component
kita perlu menginstal setiap modul misalnya NetworkModule , StorageModule dll ke SingletonComponent
for Hilt
, Anda dapat melakukan ini dengan memberi anotasi pada semua modul individual tersebut dengan @InstallIn(SingletonComponent::class)
Tetapi jika Anda memiliki banyak modul, mengubah semuanya sekaligus bukanlah ide yang baik, melainkan Anda bisa buat AggregatedModule yang akan dianotasi dengan @InstallIn(SingletonComponent::class)
dan menyertakan semua Dagger
modul ini yang dianotasi dengan @Module(includes = [ <all of these modules > ])
.
Jalankan proyek, itu akan menimbulkan kesalahan
Kesalahan DisableModuleHasInstallInCheck
Setelah Anda menjalankan proyek Hilt
akan mencoba menemukan @InstallIn
anotasi untuk setiap modul yang disertakan dengan AggregatedModule
anotasi @Module
. Hilt
akan memunculkan kesalahan jika menemukan modul yang tidak dianotasi @Install
Karena kita belum menganotasi setiap modul @InstallIn
karena kita berada di tengah migrasi, kita dapat menonaktifkan kesalahan ini menggunakan flag berikut
-Adagger.hilt.disableModulesHaveInstallInCheck=true
.
Anda dapat menentukan di level aplikasi build.gradle
seperti di bawah ini, tetapi kami harus menghapus flag ini setelah semua migrasi selesai.
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
Migrasi Kelas Aplikasi
Untuk menambahkan Hilt ke aplikasi, mari beri anotasi Application
kelas dengan @HiltAndroidApp
. Anda harus menghapus @Component
dan @Component.Builder
yang ada di AppComponent
kelas seperti yang disebutkan di atas.
Jika Anda Application
meluas dari DaggerApplication
atau mengimplementasikan HasAndroidInjector
Anda masih perlu menyimpan beberapa kode seperti yang ditunjukkan di bawah ini dalam kedua kasus ini. Ini untuk mendukung keduanya Dagger
dan Hilt
secara paralel hingga seluruh migrasi selesai.
Jika Application
ekstensi Anda dari DaggerApplication
kelas aplikasi Anda akan terlihat seperti ini.
Dan Jika Application
implementasi Anda HasAndroidInjector
maka aplikasi Anda harus terlihat seperti ini
Setelah seluruh migrasi selesai, Anda harus menghapus kode tersebut dari Application
kelas Anda dan Anda Application
akan terlihat seperti di bawah ini. (Tapi itu akan menjadi salah satu langkah terakhir, tolong jangan lakukan sekarang)
Jalankan proyek, itu harus berhasil membangun proyek Anda dan Aplikasi harus diluncurkan tanpa pengecualian waktu berjalan.
Migrasi Kelas Aktivitas
Dagger menyediakan @ContributesAndroidInjector
untuk menentukan Aktivitas/Fragmen apa pun sebagai kontributor untuk Android Injector, dalam proyek kami yang selesai di MainActivityModule
, salah satu modul disertakan dalamAggregatedModule
MainActivityModule
terlihat seperti ini sebelum migrasi
MainActivity
terlihat seperti ini sebelum migrasi
Untuk memigrasikan MainActivity
ke Hilt
, kami akan sepenuhnya menghapus MainActivityModule
kelas modul dan menambahkan anotasi @AndroidEntryPoint
untuk MainActivity
. Karena kami MainActivity
juga memperluas dari DaggerAppCompatActivity
kami perlu memperluas aktivitas kami dari yang sesuai AppCompatActivity
sehingga setelah migrasi kami MainActivity
akan terlihat seperti di bawah ini.
Jalankan proyek Anda, itu harus berhasil dengan MainActivity
bermigrasi ke Hilt
Memigrasikan Fragmen/Tampilan/BroadcastReceiver
Memigrasikan Fragmen apa pun ke dalamnya Hilt
akan dilakukan dengan langkah yang sama seperti yang kita lakukan untuk bermigrasi MainActivity
ke Hilt. Langkah-langkahnya ada di bawah
- Hapus kode tempat Anda menganotasi Fragmen Anda dengan
@ContributesAndroidInjector
kemungkinan modulnya - Hapus Modul yang
SingletonComponent
menangani@ContributesAndroidInjector
Fragmen Anda - Anotasi Fragmen Anda dengan
@AndroidEntryPoint
- jika fragmen Anda diperpanjang
DaggerFragment
maka kebutuhan Anda untuk memperluas fragmen Anda dariFragment
kelas
Migrasikan ViewModel
Memindahkan ViewModel memerlukan beberapa langkah.
Pertama beri anotasi pada viewModel Anda@HiltViewModel
Untuk FeatureViewModel
disuntikkan, Hilt
kami akan menggunakan ekstensi fragmen viewModels()
yang disediakan dalam ketergantungan ekstensi fragmen yang akan kami tambahkan dalam build.gradle
file yang sesuai seperti di bawah ini
implementation "androidx.fragment:fragment-ktx:1.5.6"
Sekarang Hapus @Bind
, @IntoMap
dan @ViewModelKey
binding yang sesuai FeatureViewModel
yang kami gunakan untuk Dagger.
Dalam belati untuk menyuntikkan ViewModel, kami juga akan memiliki lateinit var
properti yang akan digunakan injected
saat runtime menggunakan beberapa ViewModelFactory
yang juga tidak lagi diperlukan sehingga Anda dapat menghapus ViewModelModule
, ViewModelProviderFactory
dan kode terkait jika tidak ada ViewModel/Fragmen lain yang masih ada di Dagger.
Jalankan proyek Anda, itu harus berhasil dengan Fragment and ViewModel
bermigrasi ke Hilt
Migrasi Modul Lain.
Sejauh ini kami bermigrasi Components
/ Modules
/ Activity
/ Fragment
di modul aplikasi. Namun kami harus memigrasikan modul lain sekarang, Kami akan membuka modul satu per satu dan memigrasikannya sepenuhnya ke Hilt menggunakan langkah-langkah berikut
- Tambahkan
Hilt
dependensi ke dalambuild.gradle
file modul - Anotasi masing-masing
@Module
dengan@InstallIn
anotasi. - Hapus
@JvmStatic
anotasi untuk setiap@Provide
anotasi jika ada karena tidak diperlukan lagiHilt
- Anotasi
Fragment
/ AndaActivity
dengan@AndroidEntryPoint
dan hapus yang sesuai@ContributesAndroidInjector
- Migrasikan ViewModels Anda yang dianotasi dengan
@HiltViewModel
dan gunakan ekstensi fragmenviewModels()
untuk menyuntikkan Model tampilan tersebut - Terus hapus semua Modul yang tidak diperlukan lagi di
AggregatedModule
.AggregatedModule
kami buat di atas pada langkah pertama kami.
Setelah setiap modul proyek dimigrasikan ke Hilt
. Perlu waktu pembersihan
- Hapus disableModuleInstallInCheck = true, yang kami tambahkan di awal level aplikasi atau lainnya
build.gradle
dan hapus@DisableInstallInCheck
anotasi jika ditambahkan ke mana pun@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
4. Hapus semua Dagger
dependensi di semua modul Anda.
Jalankan proyek Anda itu harus berhasil menjalankan proyek Anda bermigrasi penuh ke Hilt
Ringkasan dan Takeaways
Ikhtisar tingkat tinggi dari perubahan kode setelah migrasi akan terlihat seperti ini
- Semua anotasi kode
@Component
/@Component.Builder
/@Component.Factory
/@ContributesAndroidInjector
/@ViewModelKey
akan dihapus - Semua ViewModel Anda harus diberi anotasi
@HiltViewModel
- Semua
@Module
kelas harus dianotasi dengan@InstallIn
anotasi - Fragmen/Aktivitas/Tampilan/Layanan harus diberi anotasi
@AndroidEntryPoint
- Kelas aplikasi harus diberi anotasi
@HiltAndroidApp
AppComponent
dan kode terkait harus dihapus@JvmStatic
anotasi di dalam modul Hilt tidak boleh ada lagi
- Injeksi Ketergantungan menggunakan Hilt
- Bermigrasi ke Dokumentasi Resmi Hilt
Jangan lupa follow dan jika suka :)
———————————
GitHub | LinkedIn | Twitter
Tingkatkan Pengkodean
Terima kasih telah menjadi bagian dari komunitas kami! Sebelum kamu pergi:
- Tepuk tangan untuk ceritanya dan ikuti penulisnya
- Lihat lebih banyak konten di publikasi Level Up Coding
- Kursus wawancara coding gratis ⇒ Lihat Kursus
- Ikuti kami: Twitter | LinkedIn | Buletin