How to Use Dagger Hilt in Android for Dependency Injection
To use
Dagger Hilt in Android, add the Hilt dependencies and apply the Hilt plugin in your build.gradle files, then annotate your Application class with @HiltAndroidApp. Use @Inject to request dependencies and @AndroidEntryPoint on Android components to enable injection.Syntax
@HiltAndroidApp marks your Application class to trigger Hilt's code generation.
@AndroidEntryPoint is added to Activities, Fragments, or other Android classes to allow injection.
@Inject is used to request dependencies in constructors or fields.
@Module and @InstallIn define how to provide dependencies.
kotlin
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'dagger.hilt.android.plugin'
}
dependencies {
implementation 'com.google.dagger:hilt-android:2.44'
kapt 'com.google.dagger:hilt-android-compiler:2.44'
}
@HiltAndroidApp
class MyApplication : Application() {}
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var repository: UserRepository
}Example
This example shows a simple Android app using Dagger Hilt to inject a UserRepository into an Activity.
kotlin
import android.app.Application import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material.Text import dagger.hilt.android.HiltAndroidApp import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @HiltAndroidApp class MyApp : Application() class UserRepository @Inject constructor() { fun getUser() = "User123" } @AndroidEntryPoint class MainActivity : ComponentActivity() { @Inject lateinit var userRepository: UserRepository override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { // Display user from repository Text(text = userRepository.getUser()) } } }
Output
The app screen shows the text: User123
Common Pitfalls
- Forgetting to annotate your Application class with
@HiltAndroidAppcauses injection to fail. - Missing
@AndroidEntryPointon Activities or Fragments prevents injection. - Not applying the Hilt Gradle plugin or missing dependencies leads to build errors.
- Injecting interfaces without providing a binding module causes runtime errors.
kotlin
/* Wrong: Missing @AndroidEntryPoint on Activity */ class MainActivity : AppCompatActivity() { @Inject lateinit var repo: UserRepository } /* Right: Add @AndroidEntryPoint */ @AndroidEntryPoint class MainActivity : AppCompatActivity() { @Inject lateinit var repo: UserRepository }
Quick Reference
| Annotation | Purpose |
|---|---|
| @HiltAndroidApp | Enable Hilt in Application class |
| @AndroidEntryPoint | Enable injection in Android components |
| @Inject | Request dependency injection |
| @Module | Define how to provide dependencies |
| @InstallIn | Specify component scope for modules |
Key Takeaways
Add @HiltAndroidApp to your Application class to start using Hilt.
Use @AndroidEntryPoint on Activities or Fragments to enable injection.
Annotate dependencies with @Inject to request them automatically.
Apply the Hilt Gradle plugin and add required dependencies in build files.
Provide interface bindings with @Module and @InstallIn to avoid errors.