Search code examples
androiddependency-injectiondagger-hilt

How to inject application context in a repository with Hilt?


I want to inject an application context into a repository class to create a room database instance inside the repository. I am using Hilt for dependency injection.

Can we use hilt for passing application context or do I have to manually pass it?

I am getting the following error:

[Dagger/MissingBinding] android.content.Context cannot be provided without an
@Provides-annotated method. public abstract static class ApplicationC 
implements ExartApplication_GeneratedInjector

Context Error


Solution

  • Just use @ApplicationContext annotation on your context parameter.

    By annotating context with @ApplicationContext provided by Hilt, we don't need to create a provider for the application context.

    import dagger.hilt.android.qualifiers.ApplicationContext
    
    /* For hilt versions lower than v2.28.2 use ApplicationComponent instead of
    SingletonComponent. ApplicationComponent is deprecated and even removed in 
    some versions above v2.28.2 so better refactor it to SingletonComponent. */
    
    
    @Module
    @InstallIn(SingletonComponent::class)
    class ProductionModule {
    
        @Singleton
        @Provides
        fun provideAppDatabase(@ApplicationContext appContext: Context): AppDatabase {
            return Room
                .databaseBuilder(appContext, AppDatabase::class.java, AppDatabase.DB_NAME)
                .build()
        }
    }
    

    NOTE: In case you are tempted to pass activity context as a dependency, try to use application context or rethink your use-case. Passing activity context may lead to serious implications like memory leaks. Having said that, if you know what you are doing, use @ActivityContext annotation for passing the activity context. A possible use-case might be adapters.