Dependency Injection dengan Hilt
Sederhanakan pengelolaan dependency dengan Hilt. Gunakan @HiltAndroidApp, @AndroidEntryPoint, @HiltViewModel, @Module, @Provides, dan cakupan @Singleton.
Dependency Injection dengan Hilt adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 6 dari 6. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Android Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Android Academy mencakup 6 pelajaran total.
Apa Itu Injeksi Dependensi?
Injeksi Dependensi (DI) berarti menyediakan suatu objek dengan hal-hal yang dibutuhkannya, alih-alih membiarkan objek tersebut membuat dependensinya sendiri.
Tanpa DI, sebuah kelas membuat dependensinya sendiri—hubungannya menjadi erat dan sulit diuji. Dengan DI, dependensi disuntikkan dari luar—hubungannya longgar, sehingga mudah diuji dan diganti.
DI Manual vs Hilt
DI manual dapat digunakan, tetapi menjadi menyulitkan ketika aplikasi semakin besar:
// Manual DI — you create and pass everything:
val db = AppDatabase.getInstance(context)
val dao = db.userDao()
val repo = UserRepository(dao)
val factory = UserViewModel.Factory(repo)
val viewModel = ViewModelProvider(this, factory)[UserViewModel::class.java]
// With Hilt:
// Just annotate, Hilt does the wiring
@HiltViewModel
class UserViewModel @Inject constructor(private val repo: UserRepository) : ViewModel()Menambahkan Hilt
Tambahkan Hilt ke proyek Anda:
// project/build.gradle:
buildscript {
dependencies {
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51'
}
}
// app/build.gradle:
plugins {
id 'com.google.dagger.hilt.android'
id 'kotlin-kapt'
}
dependencies {
implementation 'com.google.dagger:hilt-android:2.51'
kapt 'com.google.dagger:hilt-android-compiler:2.51'
}@HiltAndroidApp
Beri anotasi Application Anda dengan @HiltAndroidApp. Ini adalah titik masuk untuk hierarki komponen Hilt:
@HiltAndroidApp
class MyApp : Application()
// Also register in AndroidManifest.xml:
// <application android:name=".MyApp" ...>@AndroidEntryPoint
Tambahkan @AndroidEntryPoint ke Activity, Fragment, dan Service yang memerlukan dependensi yang diinjeksi:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var analytics: AnalyticsService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
analytics.logEvent("app_open")
}
}
@AndroidEntryPoint
class HomeFragment : Fragment() {
// Fragment's parent Activity must also be @AndroidEntryPoint
}@Inject — Injeksi Konstruktor
Tandai konstruktor dengan @Inject untuk memberi tahu Hilt cara membuat kelas tersebut. Hilt otomatis menyelesaikan semua parameternya:
class UserRepository @Inject constructor(
private val userDao: UserDao,
private val apiService: ApiService
) {
suspend fun getUsers() = userDao.getAll()
suspend fun syncFromNetwork() {
val users = apiService.fetchUsers()
userDao.insertAll(users)
}
}
// Hilt sees UserRepository needs UserDao and ApiService,
// and automatically creates and injects them.@HiltViewModel
Beri anotasi pada ViewModel Anda dengan @HiltViewModel dan gunakan @Inject constructor. Dalam Fragment, dapatkan ViewModel dengan by viewModels():
@HiltViewModel
class UserViewModel @Inject constructor(
private val repo: UserRepository
) : ViewModel() {
val users = repo.getUsersFlow().asLiveData()
}
// In Fragment:
@AndroidEntryPoint
class UserFragment : Fragment() {
private val viewModel: UserViewModel by viewModels() // Hilt provides it
}@Module & @Provides
Ketika Hilt tidak dapat menggunakan injeksi konstruktor (misalnya pada antarmuka atau kelas pihak ketiga), sediakan instans melalui @Module:
@Module
@InstallIn(SingletonComponent::class) // lives for app lifetime
object NetworkModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
@Provides
@Singleton
fun provideApiService(retrofit: Retrofit): ApiService {
return retrofit.create(ApiService::class.java)
}
}@Binds — Pengikatan Antarmuka
Gunakan @Binds untuk memberi tahu Hilt implementasi mana yang harus digunakan untuk suatu antarmuka:
interface AnalyticsService {
fun logEvent(name: String)
}
class FirebaseAnalytics @Inject constructor() : AnalyticsService {
override fun logEvent(name: String) { /* Firebase impl */ }
}
@Module
@InstallIn(SingletonComponent::class)
abstract class AnalyticsModule {
@Binds
@Singleton
abstract fun bindAnalytics(impl: FirebaseAnalytics): AnalyticsService
}Cakupan Hilt
Cakupan menentukan berapa lama instans yang diinjeksi tetap hidup:
@Singleton— satu instans selama masa hidup aplikasi (ApplicationComponent)@ActivityRetainedScoped— bertahan melewati perubahan konfigurasi@ActivityScoped— satu instans untuk setiap Activity@FragmentScoped— satu instans untuk setiap Fragment@ViewModelScoped— satu instans untuk setiap ViewModel
Pengujian dengan Hilt
Ganti dependensi nyata dengan tiruan dalam pengujian menggunakan dukungan pengujian Hilt:
@HiltAndroidTest
class UserRepositoryTest {
@get:Rule
val hiltRule = HiltAndroidRule(this)
@Inject
lateinit var repo: UserRepository
@Before
fun setUp() {
hiltRule.inject()
}
@Test
fun usersAreFetched() {
assertNotNull(repo)
}
}Pemeriksaan Singkat
Anotasi mana yang memberi tahu Hilt untuk membuat hierarki komponen DI untuk seluruh aplikasi Anda?
Ringkasan: Injeksi Dependensi Hilt
Hilt membuat DI hampir otomatis di Android:
@HiltAndroidApppada kelas Application Anda@AndroidEntryPointpada Activity dan Fragment@Inject constructoruntuk kelas yang dapat diinjeksi@HiltViewModel+@Inject constructoruntuk ViewModel@Module+@Providesuntuk kelas dan antarmuka pihak ketiga@Singletonuntuk berbagi satu instans di seluruh aplikasi
Berikutnya: notifikasi push dengan Firebase Cloud Messaging.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Dependency Injection dengan Hilt” gratis?
Ya — teks lengkap “Dependency Injection dengan Hilt” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Android Academy, upgrade ke CoddyKit PRO. Kursus Android Academy mencakup 6 pelajaran total.
Apa yang akan aku pelajari di “Dependency Injection dengan Hilt”?
Sederhanakan pengelolaan dependency dengan Hilt. Gunakan @HiltAndroidApp, @AndroidEntryPoint, @HiltViewModel, @Module, @Provides, dan cakupan @Singleton. Kamu berlatih Android Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Android Academy?
Tidak diperlukan pengalaman sebelumnya. Android Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 6 dari 6.
Berapa lama pelajaran “Dependency Injection dengan Hilt” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Android Academy ini?
Ya. Setiap pelajaran Android Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- ViewModel & LiveData
- Basis Data Room
- Coroutine & Fungsi Suspend
- Pola Repository
- Komponen Navigasi
- Dependency Injection dengan Hilt