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
To use @HiltViewModel , you'll need to add these 2 libraries on top of the Dagger Hilt Libraries added as shared in the article above. In your ViewModel, just add @HiltViewModel before the class and the usual @Inject to the constructor. Here we auto have the savedStateHandler injected too.
Dependency injection (DI) is a technique widely used in programming and well suited to Android development, where dependencies are provided to a class instead of creating them itself. By following DI principles, you lay the groundwork for good app architecture, greater code reusability, and ease of testing.
In order to do so, Go to app > java > package > Right-click > New > Kotlin Class/File and create a new class and name it as MainViewModel. kt. We will annotate it with @HiltViewModel which makes the models to be created using Hilt's model factory that makes it easier to be used with Activities and Fragments.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With