Android Academy · Les

Dependency injection met Hilt

Vereenvoudig dependencybeheer met Hilt. Gebruik @HiltAndroidApp, @AndroidEntryPoint, @HiltViewModel, @Module, @Provides en @Singleton-scopes.

Les 6 van 613 stappen

Dependency injection met Hilt is een gratis Android Academy-les op CoddyKit. Dit is les 6 van 6. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Android Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Android Academy bevat in totaal 6 lessen.

Wat is dependency-injectie?

Dependency-injectie (DI) betekent dat je een object voorziet van wat het nodig heeft, in plaats van dat het zijn afhankelijkheden zelf maakt.

Zonder DI maakt een klasse haar eigen afhankelijkheden — sterk gekoppeld en moeilijk te testen. Met DI worden afhankelijkheden van buitenaf geïnjecteerd — los gekoppeld en eenvoudig te testen en te vervangen.

Handmatige DI versus Hilt

Handmatige DI werkt, maar wordt op grotere schaal lastig:

// 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()

Hilt toevoegen

Voeg Hilt toe aan je project:

// 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

Voorzie je Application-klasse van de annotatie @HiltAndroidApp. Dit is het startpunt voor de hiërarchie van Hilt-componenten:

@HiltAndroidApp
class MyApp : Application()

// Also register in AndroidManifest.xml:
// <application android:name=".MyApp" ...>

@AndroidEntryPoint

Voeg @AndroidEntryPoint toe aan Activities, Fragments en Services die geïnjecteerde afhankelijkheden nodig hebben:

@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 — constructorinjectie

Markeer de constructor met @Inject om Hilt te laten weten hoe de klasse moet worden gemaakt. Hilt lost alle parameters automatisch op:

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

Voorzie je ViewModel van @HiltViewModel en gebruik @Inject constructor. Haal deze in het Fragment op met 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 en @Provides

Wanneer Hilt geen constructorinjectie kan gebruiken (bijvoorbeeld voor interfaces en klassen van derden), lever je instanties aan via een @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 — interfacekoppeling

Gebruik @Binds om Hilt te vertellen welke implementatie voor een interface moet worden gebruikt:

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
}

Hilt-bereiken

Bereiken bepalen hoelang een geïnjecteerde instantie blijft bestaan:

  • @Singleton — één instantie gedurende de levensduur van de app (ApplicationComponent)
  • @ActivityRetainedScoped — blijft bestaan bij configuratiewijzigingen
  • @ActivityScoped — één instantie per Activity
  • @FragmentScoped — één instantie per Fragment
  • @ViewModelScoped — één instantie per ViewModel

Testen met Hilt

Vervang echte afhankelijkheden door nepimplementaties in tests met de testondersteuning van 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)
    }
}

Korte controle

Welke annotatie geeft Hilt de opdracht om de DI-componenthiërarchie voor je volledige applicatie te genereren?

Samenvatting: dependency-injectie met Hilt

Hilt maakt DI in Android vrijwel automatisch:

  • @HiltAndroidApp op je Application-klasse
  • @AndroidEntryPoint op Activities en Fragments
  • @Inject constructor voor injecteerbare klassen
  • @HiltViewModel + @Inject constructor voor ViewModels
  • @Module + @Provides voor klassen van derden en interfaces
  • @Singleton om één instantie in de hele app te delen

Volgende: pushmeldingen met Firebase Cloud Messaging.

Gratis beginnen

Leer Kotlin met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
36
Lessen
152

Veelgestelde vragen

Is de les “Dependency injection met Hilt” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Android Academy, waaronder “Dependency injection met Hilt”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Android Academy bevat in totaal 6 lessen.

Wat leer ik in “Dependency injection met Hilt”?

Vereenvoudig dependencybeheer met Hilt. Gebruik @HiltAndroidApp, @AndroidEntryPoint, @HiltViewModel, @Module, @Provides en @Singleton-scopes. Je oefent met Android Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Android Academy te beginnen?

Ervaring vooraf is niet nodig. Android Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 6 van 6.

Hoe lang duurt de les “Dependency injection met Hilt”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Android Academy?

Ja. Elke les over Android Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. ViewModel en LiveData
  2. Room-database
  3. Coroutines en suspend-functies
  4. Repository-patroon
  5. Navigation Component
  6. Dependency injection met Hilt
← Terug naar Android Academy