DEV Community

myougaTheAxo
myougaTheAxo

Posted on • Originally published at zenn.dev

Hilt Dependency Injection Complete Guide - Modules, Scopes & Testing

Complete Hilt Dependency Injection Guide

Master Hilt for managing dependencies across your Android app.

@HiltAndroidApp Entry Point

@HiltAndroidApp
class MyApplication : Application()
Enter fullscreen mode Exit fullscreen mode

Module Definition

@Module
@InstallIn(SingletonComponent::class)
object RepositoryModule {
    @Provides
    @Singleton
    fun provideUserRepository(
        api: ApiService
    ): UserRepository = UserRepositoryImpl(api)
}
Enter fullscreen mode Exit fullscreen mode

@Provides vs @Binds

// @Provides for complex instantiation
@Provides
fun provideApiService(): ApiService =
    Retrofit.Builder()
        .baseUrl(BASE_URL)
        .build()
        .create(ApiService::class.java)

// @Binds for interface to impl mapping
@Binds
fun bindRepository(
    impl: UserRepositoryImpl
): UserRepository
Enter fullscreen mode Exit fullscreen mode

Scope Annotations

  • @singleton: App lifetime
  • @ViewModelScoped: ViewModel lifetime
  • @ActivityScoped: Activity lifetime
  • @FragmentScoped: Fragment lifetime

@HiltViewModel

@HiltViewModel
class UserViewModel @Inject constructor(
    private val repository: UserRepository
) : ViewModel() {
    // ViewModel automatically injected
}
Enter fullscreen mode Exit fullscreen mode

Test Module Replacement

@Module
@InstallIn(SingletonComponent::class)
object TestRepositoryModule {
    @Provides
    @Singleton
    fun provideUserRepository(): UserRepository =
        FakeUserRepository()
}
Enter fullscreen mode Exit fullscreen mode

Setup Checklist

  1. Add Hilt dependencies
  2. Apply Hilt gradle plugin
  3. Create @HiltAndroidApp
  4. Define @Module with @InstallIn
  5. Inject via @Inject in constructors
  6. Use @HiltViewModel for ViewModels

8 Android app templates on Gumroad

Top comments (0)