Skip to content

Android Dependency Injection with Hilt

Intermediate

Hilt (built on Dagger) as the recommended DI framework for Android. Parallels Spring's IoC container but with Android lifecycle awareness.

Key Facts

  • Hilt is Google's recommended DI for Android - built on Dagger 2 with less boilerplate
  • @HiltAndroidApp on Application class enables Hilt
  • @AndroidEntryPoint on Activity/Fragment enables injection
  • @HiltViewModel with @Inject constructor for ViewModel injection
  • @Module + @InstallIn for providing third-party dependencies
  • @Singleton, @ActivityScoped, @ViewModelScoped control lifecycle
  • Parallels Spring's @Component/@Service/@Bean pattern

Patterns

Application Setup

@HiltAndroidApp
class MyApp : Application()

Activity/Fragment Injection

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var repository: UserRepository
}

ViewModel Injection

@HiltViewModel
class UserViewModel @Inject constructor(
    private val repository: UserRepository
) : ViewModel() {
    // No ViewModelFactory needed!
}

Module for Third-Party Dependencies

@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides @Singleton
    fun provideApiService(): ApiService {
        return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }

    @Provides @Singleton
    fun provideUserRepository(api: ApiService, dao: UserDao): UserRepository {
        return UserRepository(api, dao)
    }

    @Provides @Singleton
    fun provideDatabase(@ApplicationContext context: Context): AppDatabase {
        return Room.databaseBuilder(context, AppDatabase::class.java, "app_db").build()
    }

    @Provides
    fun provideUserDao(db: AppDatabase): UserDao = db.userDao()
}

Spring IoC vs Hilt Comparison

Spring Hilt Purpose
@Component @Inject constructor Auto-discovered bean
@Service @Inject constructor Business logic
@Bean in @Configuration @Provides in @Module Explicit creation
@Autowired @Inject Field/constructor injection
@Scope("singleton") @Singleton Scope control
@Qualifier @Qualifier + @Named Disambiguation

Gotchas

  • @Inject lateinit var fields must NOT be private in Activities/Fragments
  • @HiltViewModel requires @Inject constructor - cannot use no-arg constructor
  • Hilt modules must specify @InstallIn with appropriate component (SingletonComponent, ActivityComponent, etc.)
  • Missing @AndroidEntryPoint on Fragment's host Activity causes runtime crash

See Also