0Pricing
Android Academy · Pelajaran

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:

  • @HiltAndroidApp pada kelas Application Anda
  • @AndroidEntryPoint pada Activity dan Fragment
  • @Inject constructor untuk kelas yang dapat diinjeksi
  • @HiltViewModel + @Inject constructor untuk ViewModel
  • @Module + @Provides untuk kelas dan antarmuka pihak ketiga
  • @Singleton untuk 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

  1. ViewModel & LiveData
  2. Basis Data Room
  3. Coroutine & Fungsi Suspend
  4. Pola Repository
  5. Komponen Navigasi
  6. Dependency Injection dengan Hilt
← Kembali ke Android Academy