如何使用 Hilt 在存储库中注入应用程序上下文?

Posted

技术标签:

【中文标题】如何使用 Hilt 在存储库中注入应用程序上下文?【英文标题】:How to inject application context in a repository with Hilt? 【发布时间】:2020-11-14 06:45:36 【问题描述】:

我想将应用程序上下文注入到存储库类中,以在存储库中创建房间数据库实例。我正在使用 Hilt 进行依赖注入。

我们可以使用 hilt 来传递应用程序上下文还是我必须手动传递它?

我收到以下错误:

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

【问题讨论】:

图片和屏幕截图可以很好地添加到帖子中,但请确保帖子在没有它们的情况下仍然清晰且有用。如果您发布代码或错误消息的图像,请确保您还复制并粘贴或直接将实际代码/消息输入到帖子中。请参阅Why may I not upload images of code on SO when asking a question?——同样的推理也适用于错误消息。所需文本内容仅出现在图片中的帖子可能会因为缺乏足够的细节而被关闭。 嘿...如果有帮助,您能接受我的回答吗??我会帮上大忙的:) 【参考方案1】:

只需在上下文参数上使用@ApplicationContext 注释即可。

通过使用 @ApplicationContext 提供的注释上下文 Hilt,我们不需要为应用程序上下文创建提供程序。

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()
    

注意:如果您想将活动上下文作为依赖项传递,请尝试使用应用程序上下文或重新考虑您的用例。传递活动上下文可能会导致严重的影响,例如内存泄漏。话虽如此,如果您知道自己在做什么,请使用@ActivityContext 注释来传递活动上下文。一个可能的用例可能是适配器。

【讨论】:

有没有办法给ActivityContext注解? 救了我一天! @ArulMani 如果您需要注入活动上下文,也许您做错了什么。 ActivityContext 是一个脆弱的东西,我不认为它会被粗心地注入。 @Ashu 有没有办法进行上下文的现场注入? @RissmonSuresh 你能解释一下你的用例吗?通常你更喜欢使用构造函数注入。

以上是关于如何使用 Hilt 在存储库中注入应用程序上下文?的主要内容,如果未能解决你的问题,请参考以下文章

Android依赖注入框架Hilt基本使用

Android Hilt依赖注入框架

Hilt 在 android 库中使用

Hilt 实战 | 创建应用级别 CoroutineScope

Hilt 稳定版发布 | 更便捷的 Android 依赖项注入

安卓||在 Hilt 不支持的类中注入依赖项,例如 Helper 类