使用Hilt依赖注入时,如何向PermissionManager传递Context?
嗨,刚接触Hilt确实容易在这些细节上卡壳,我来帮你捋清楚~
首先告诉你一个好消息:你其实已经走在正确的路上了,只是代码里有个小冲突导致你可能没搞明白怎么回事。
推荐方案:用构造函数自动注入(最简洁)
Hilt本身已经能自动提供@ApplicationContext类型的实例,所以你完全不需要在Module里写额外的@Provides方法,直接靠构造函数注入就可以搞定:
- 先把你写的
PermissionsModule里的providesPermissionManager方法删掉,如果这个Module里只有这一个方法,那整个Module都可以直接删掉 - 你的
PermissionManager代码保持原样就行:
class PermissionManager @Inject constructor( @ApplicationContext private val context: Context ) { // 这里可以加你的权限处理逻辑 }
- 之后在需要使用
PermissionManager的地方,比如Activity里,只需要:- 给你的Activity加上
@AndroidEntryPoint注解 - 用
@Inject lateinit var permissionManager: PermissionManager来注入实例
- 给你的Activity加上
这样Hilt就会自动把Application级别的Context注入到PermissionManager里,完全不需要你手动传参数!
备选方案:通过Module提供实例(不推荐,但可以了解)
如果你一定要用Module来创建PermissionManager实例,那需要调整PermissionManager的构造函数,去掉@Inject注解,因为此时是Module负责创建实例:
- 保留你的
PermissionsModule代码不变:
@Module @InstallIn(SingletonComponent::class) interface PermissionsModule { @Provides @Singleton @ApplicationScope fun providesPermissionManager( @ApplicationContext context: Context ): PermissionManager = PermissionManager(context) }
- 修改
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

