Bermigrasi dari Dagger2 ke Hilt dalam project multi modul

May 10 2023
Panduan langkah demi langkah untuk bermigrasi dari Dagger ke Hilt dalam project multi modul. Struktur Proyek Untuk memvisualisasikan proyek, ini berisi beberapa modul NetworkModule, StorageModule, CommonModule, FeatureModule dll.

Panduan langkah demi langkah untuk bermigrasi dari Daggerke Hiltproyek multi modul.

Foto oleh Saif71.com di Unsplash

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 Daggerke Hilttetapi dalam praktiknya kami memerlukan pendekatan tambahan di mana kami pertama-tama akan memigrasikan appproyek kami ke Hiltdan kemudian modul lain, itu berarti Daggerdan Hiltharus bekerja secara paralel untuk beberapa waktu hingga migrasi lengkap selesai.

Versi

Cerita ini akan melakukan migrasi dari Dagger 2.24ke 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 Hiltapp Gradlebuild.gradle

Konfigurasikan juga kaptuntuk menyetel correctErrorType ke truedalam build.gradlefile

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 Componentyang menyertakan semua modul Dagger yang dibuat di aplikasi atau modul lain dari proyek dan itu biasanya dilakukan di AppComponentkelas yang dibuat untuk Dagger.

Mari kita lihat file AppComponent.kt saat ini

Untuk bermigrasi, Singleton Componentkita perlu menginstal setiap modul misalnya NetworkModule , StorageModule dll ke SingletonComponentfor 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 Daggermodul ini yang dianotasi dengan @Module(includes = [ <all of these modules > ]).

Jalankan proyek, itu akan menimbulkan kesalahan

Kesalahan DisableModuleHasInstallInCheck

Setelah Anda menjalankan proyek Hiltakan mencoba menemukan @InstallInanotasi untuk setiap modul yang disertakan dengan AggregatedModuleanotasi @Module. Hiltakan memunculkan kesalahan jika menemukan modul yang tidak dianotasi @InstallKarena kita belum menganotasi setiap modul @InstallInkarena kita berada di tengah migrasi, kita dapat menonaktifkan kesalahan ini menggunakan flag berikut

-Adagger.hilt.disableModulesHaveInstallInCheck=true.

Anda dapat menentukan di level aplikasi build.gradleseperti 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 Applicationkelas dengan @HiltAndroidApp. Anda harus menghapus @Componentdan @Component.Builderyang ada di AppComponentkelas seperti yang disebutkan di atas.

Jika Anda Applicationmeluas dari DaggerApplicationatau mengimplementasikan HasAndroidInjectorAnda masih perlu menyimpan beberapa kode seperti yang ditunjukkan di bawah ini dalam kedua kasus ini. Ini untuk mendukung keduanya Daggerdan Hiltsecara paralel hingga seluruh migrasi selesai.

Jika Applicationekstensi Anda dari DaggerApplicationkelas aplikasi Anda akan terlihat seperti ini.

Dan Jika Applicationimplementasi Anda HasAndroidInjectormaka aplikasi Anda harus terlihat seperti ini

Setelah seluruh migrasi selesai, Anda harus menghapus kode tersebut dari Applicationkelas Anda dan Anda Applicationakan 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 @ContributesAndroidInjectoruntuk menentukan Aktivitas/Fragmen apa pun sebagai kontributor untuk Android Injector, dalam proyek kami yang selesai di MainActivityModule, salah satu modul disertakan dalamAggregatedModule

MainActivityModuleterlihat seperti ini sebelum migrasi

MainActivityterlihat seperti ini sebelum migrasi

Untuk memigrasikan MainActivityke Hilt, kami akan sepenuhnya menghapus MainActivityModulekelas modul dan menambahkan anotasi @AndroidEntryPointuntuk MainActivity. Karena kami MainActivityjuga memperluas dari DaggerAppCompatActivitykami perlu memperluas aktivitas kami dari yang sesuai AppCompatActivitysehingga setelah migrasi kami MainActivityakan terlihat seperti di bawah ini.

Jalankan proyek Anda, itu harus berhasil dengan MainActivitybermigrasi ke Hilt

Memigrasikan Fragmen/Tampilan/BroadcastReceiver

Memigrasikan Fragmen apa pun ke dalamnya Hiltakan dilakukan dengan langkah yang sama seperti yang kita lakukan untuk bermigrasi MainActivityke Hilt. Langkah-langkahnya ada di bawah

  1. Hapus kode tempat Anda menganotasi Fragmen Anda dengan @ContributesAndroidInjectorkemungkinan modulnya
  2. Hapus Modul yang SingletonComponentmenangani @ContributesAndroidInjectorFragmen Anda
  3. Anotasi Fragmen Anda dengan@AndroidEntryPoint
  4. jika fragmen Anda diperpanjang DaggerFragmentmaka kebutuhan Anda untuk memperluas fragmen Anda dari Fragmentkelas

Migrasikan ViewModel

Memindahkan ViewModel memerlukan beberapa langkah.

Pertama beri anotasi pada viewModel Anda@HiltViewModel

Untuk FeatureViewModeldisuntikkan, Hiltkami akan menggunakan ekstensi fragmen viewModels()yang disediakan dalam ketergantungan ekstensi fragmen yang akan kami tambahkan dalam build.gradlefile yang sesuai seperti di bawah ini

implementation "androidx.fragment:fragment-ktx:1.5.6"

Sekarang Hapus @Bind, @IntoMapdan @ViewModelKeybinding yang sesuai FeatureViewModelyang kami gunakan untuk Dagger.

Dalam belati untuk menyuntikkan ViewModel, kami juga akan memiliki lateinit varproperti yang akan digunakan injectedsaat runtime menggunakan beberapa ViewModelFactoryyang juga tidak lagi diperlukan sehingga Anda dapat menghapus ViewModelModule, ViewModelProviderFactorydan kode terkait jika tidak ada ViewModel/Fragmen lain yang masih ada di Dagger.

Jalankan proyek Anda, itu harus berhasil dengan Fragment and ViewModelbermigrasi ke Hilt

Migrasi Modul Lain.

Sejauh ini kami bermigrasi Components/ Modules/ Activity/ Fragmentdi 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

  1. Tambahkan Hiltdependensi ke dalam build.gradlefile modul
  2. Anotasi masing-masing @Moduledengan @InstallInanotasi.
  3. Hapus @JvmStaticanotasi untuk setiap @Provideanotasi jika ada karena tidak diperlukan lagiHilt
  4. Anotasi Fragment/ Anda Activitydengan @AndroidEntryPointdan hapus yang sesuai@ContributesAndroidInjector
  5. Migrasikan ViewModels Anda yang dianotasi dengan @HiltViewModeldan gunakan ekstensi fragmen viewModels()untuk menyuntikkan Model tampilan tersebut
  6. 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

  1. Hapus disableModuleInstallInCheck = true, yang kami tambahkan di awal level aplikasi atau lainnya build.gradledan hapus @DisableInstallInCheckanotasi jika ditambahkan ke mana pun@Module
  2. defaultConfig {
       
        //TODO: remove this after migration to Hilt
        javaCompileOptions {
            annotationProcessorOptions {
                arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
            }
        }
    }
    

4. Hapus semua Daggerdependensi 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

  1. Semua anotasi kode @Component/ @Component.Builder/ @Component.Factory/ @ContributesAndroidInjector/ @ViewModelKeyakan dihapus
  2. Semua ViewModel Anda harus diberi anotasi@HiltViewModel
  3. Semua @Modulekelas harus dianotasi dengan @InstallInanotasi
  4. Fragmen/Aktivitas/Tampilan/Layanan harus diberi anotasi@AndroidEntryPoint
  5. Kelas aplikasi harus diberi anotasi@HiltAndroidApp
  6. AppComponentdan kode terkait harus dihapus
  7. @JvmStaticanotasi 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