Panduan Lengkap Injeksi Dependensi dengan Hilt di Android

  • Hilt menyederhanakan Dagger dengan menyediakan kontainer otomatis yang selaras dengan siklus hidup Android.
  • Ini memungkinkan pemisahan kode melalui injeksi konstruktor, modul dengan @Provides dan @Binds.
  • Kelola cakupan instance menggunakan komponen spesifik seperti SingletonComponent atau ActivityComponent.
  • Hal ini mempermudah pengembangan arsitektur yang terukur dan mudah diuji, terutama di lingkungan dengan Jetpack Compose dan MVVM.

Hilt Android

Jika Anda mengembangkan aplikasi Android, Anda mungkin pernah mengalami kebutuhan untuk mengatur kelas-kelas Anda dengan lebih baik agar proyek tidak menjadi kacau. Di sinilah dependency injection berperan , sebuah pola desain yang, meskipun awalnya mungkin tampak seperti sihir hitam, pada dasarnya adalah cara untuk menyediakan setiap kelas dengan objek yang dibutuhkannya tanpa kelas tersebut harus membuatnya sendiri.

Hilt hadir untuk menyelamatkan kita dari kerumitan Dagger, menawarkan lapisan teratas yang menstandarisasi penyisipan dependensi . Dengan berintegrasi dengan Jetpack, Hilt secara otomatis mengelola kontainer dan siklus hidup, memungkinkan kita untuk fokus pada logika bisnis alih-alih memindahkan objek seperti sedang pindah rumah.

Konfigurasi Lingkungan Awal

Untuk memulai menggunakan Hilt, langkah pertama adalah mempersiapkan lingkungan Gradle. Sangat penting untuk menambahkan hilt-android-gradle-plugin ke file konfigurasi tingkat proyek Anda. Kemudian, di file modul aplikasi Anda, Anda perlu menerapkan plugin dan menambahkan dependensi yang sesuai, memastikan bahwa kompiler (baik menggunakan kapt atau KSP) dikonfigurasi dengan benar.

Satu detail penting adalah, agar semuanya berjalan lancar, proyek harus dikonfigurasi untuk menggunakan Java 17 (atau Java 8 untuk versi yang lebih lama), karena ini merupakan prasyarat agar Hilt dan Jetpack Compose dapat bekerja sama dengan lancar. Jika Anda melihat bahwa program tidak dapat dikompilasi saat Anda mengaktifkan plugin, periksa kembali apakah versi Kotlin dan KSP sama persis, karena perbedaan sekecil apa pun dapat merusak seluruh proses kompilasi.

Inti dari Hilt: Kelas Aplikasi

Aplikasi apa pun yang ingin memanfaatkan pustaka ini harus memiliki kelas Application khusus. Membuatnya saja tidak cukup; kelas tersebut harus ditandai dengan anotasi @HiltAndroidApp . Baris ini memicu pembuatan kode Hilt dan membuat kontainer akar aplikasi.

Konteks di Android
Artikel terkait:
Panduan Lengkap tentang Konteks di Android: Apa itu dan Bagaimana Mengelolanya

Komponen tingkat atas ini sangat penting karena terhubung dengan siklus hidup aplikasi secara keseluruhan dan berfungsi sebagai fondasi bagi semua komponen lain untuk mengakses dependensi yang didefinisikan pada tingkat ini. Tentu saja, jangan lupa untuk mendaftarkan kelas ini di file AndroidManifest.xml menggunakan atribut name, atau Hilt tidak akan terdeteksi sama sekali.

Menginjeksi Dependensi ke dalam Komponen Android

Setelah aplikasi siap, kita dapat mulai menyuntikkan dependensi ke dalam aktivitas, fragmen, tampilan, atau layanan. Untuk melakukan ini, kita menggunakan anotasi @AndroidEntryPoint . Ini memberi tahu Hilt bahwa kelas ini adalah titik masuk dan bahwa Hilt harus menghasilkan komponen khusus untuknya.

Ketika kita ingin mendapatkan dependensi spesifik dalam sebuah activity, kita menggunakan injeksi field melalui anotasi @Inject. Sangat penting untuk diingat bahwa field-field ini tidak boleh bersifat private ; jika Anda mencoba menggunakan modifier private, compiler akan langsung menampilkan error. Dalam kasus Jetpack Compose, cukup dengan memberi anotasi pada Activity root memungkinkan kita untuk mengakses ViewModel secara langsung di dalam fungsi-fungsi composable.

Strategi untuk Mendefinisikan Keterkaitan

Hilt perlu mengetahui cara membuat objek yang kita minta. Cara paling langsung adalah melalui injeksi konstruktor , di mana kita menempatkan `@Inject` tepat sebelum konstruktor kelas. Ini memungkinkan Hilt untuk menganalisis parameter dan menentukan cara menyediakan setiap dependensi tersebut.

Namun, ada kalanya kita tidak memiliki kendali penuh atas kelas tersebut, misalnya saat menggunakan pustaka eksternal seperti Retrofit atau OkHttpClient. Di sinilah Hilt Modules berperan . Sebuah modul adalah kelas yang diberi anotasi @Module dan harus menyertakan @InstallIn untuk menentukan komponen mana yang harus menampung dependensi tersebut.

  • Penggunaan @Provides: Ini digunakan ketika kelas tersebut merupakan kelas pihak ketiga atau memerlukan pola konstruksi yang kompleks. Di sini kita mendefinisikan sebuah fungsi yang mengembalikan instance yang dibutuhkan.
  • Menggunakan @Binds: Ini adalah pilihan ideal ketika kita ingin menghubungkan sebuah antarmuka dengan implementasi konkret. Ini didefinisikan sebagai fungsi abstrak yang memberi tahu Hilt: "ketika seseorang meminta antarmuka ini, berikan mereka implementasi ini."

Manajemen Lingkup dan Siklus Hidup

Secara default, Hilt membuat instance baru setiap kali dependensi diminta. Namun, terkadang kita membutuhkan objek yang tetap sama sepanjang masa pakai aplikasi atau layar. Untuk itu, kita menggunakan scope komponen.

Jika kita menandai sebuah kelas dengan @Singleton dan memasangnya di SingletonComponent, kita akan memiliki satu instance global tunggal. Jika kita lebih suka objek tersebut hanya ada selama durasi aktivitas, kita menggunakan @ActivityScoped di dalam ActivityComponent. Sangat penting untuk tidak menggunakan scope secara berlebihan, karena menyimpan objek di memori terlalu lama dapat berdampak negatif pada kinerja aplikasi.

Kasus Khusus dan Kualifikasi

Terkadang kita perlu menyuntikkan dua implementasi berbeda dari antarmuka yang sama. Untuk menghindari membebani kompiler, kita menggunakan qualifier . Qualifier pada dasarnya adalah anotasi khusus yang digunakan untuk memberi label pada binding tertentu, memungkinkan kita untuk membedakan, misalnya, antara klien HTTP untuk otentikasi dan klien untuk permintaan umum.

mvvm
Artikel terkait:
MVVM: Pola Arsitektur Perangkat Lunak Terbaik untuk Aplikasi Modern

Selain itu, Hilt menyederhanakan berbagai hal dengan kualifikasi yang telah ditentukan sebelumnya seperti @ApplicationContext dan @ActivityContext, memungkinkan kita untuk mendapatkan konteks Android tanpa harus mengkonfigurasi modul secara manual. Terakhir, untuk kelas yang tidak didukung Hilt secara native (seperti ContentProviders), kita dapat menggunakan anotasi @EntryPoint , menciptakan jembatan manual untuk mengekstrak dependensi dari grafik Hilt. Bagikan informasi ini agar lebih banyak pengguna dapat mempelajarinya.


Tambahkan sebagai sumber pilihan di Google