You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hilt依赖注入时,如何向PermissionManager传递Context?

使用Hilt依赖注入时,如何向PermissionManager传递Context?

嗨,刚接触Hilt确实容易在这些细节上卡壳,我来帮你捋清楚~

首先告诉你一个好消息:你其实已经走在正确的路上了,只是代码里有个小冲突导致你可能没搞明白怎么回事。

推荐方案:用构造函数自动注入(最简洁)

Hilt本身已经能自动提供@ApplicationContext类型的实例,所以你完全不需要在Module里写额外的@Provides方法,直接靠构造函数注入就可以搞定:

  1. 先把你写的PermissionsModule里的providesPermissionManager方法删掉,如果这个Module里只有这一个方法,那整个Module都可以直接删掉
  2. 你的PermissionManager代码保持原样就行:
class PermissionManager @Inject constructor(
    @ApplicationContext private val context: Context
) {
    // 这里可以加你的权限处理逻辑
}
  1. 之后在需要使用PermissionManager的地方,比如Activity里,只需要:
    • 给你的Activity加上@AndroidEntryPoint注解
    • 用@Inject lateinit var permissionManager: PermissionManager来注入实例

这样Hilt就会自动把Application级别的Context注入到PermissionManager里,完全不需要你手动传参数!

备选方案:通过Module提供实例(不推荐,但可以了解)

如果你一定要用Module来创建PermissionManager实例,那需要调整PermissionManager的构造函数,去掉@Inject注解,因为此时是Module负责创建实例:

  1. 保留你的PermissionsModule代码不变:
@Module
@InstallIn(SingletonComponent::class)
interface PermissionsModule {
    @Provides
    @Singleton
    @ApplicationScope
    fun providesPermissionManager(
        @ApplicationContext context: Context
    ): PermissionManager = PermissionManager(context)
}
  1. 修改PermissionManager的构造函数:
class PermissionManager(
    private val context: Context
) {
}

这种方式也能让Hilt把@ApplicationContext传入Module的方法,再创建PermissionManager实例,但相比第一种方案多了冗余代码,所以更推荐用构造函数注入的方式。

为什么你之前的写法有问题?

你同时给PermissionManager加了@Inject构造函数,又在Module里写了@Provides方法,这会让Hilt陷入困惑——它不知道该用哪种方式来创建PermissionManager的实例,所以得二选一。

最后再给你个小验证技巧:在Activity里注入PermissionManager后,你可以在onCreate里打印一下permissionManager.context,如果能正常输出Application的实例信息,就说明Context已经正确注入啦~

备注:内容来源于stack exchange,提问作者HitMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:13:05