Hilt中无需构造注入时非Activity/Fragment类如何通过字段注入获取Context
解决方案
方案1:全局缓存ApplicationContext(推荐,实现最简单)
因为你用到的入口点安装在SingletonComponent中,只需要ApplicationContext即可,而ApplicationContext本身是应用级单例,全局缓存不会产生内存泄漏风险,完全符合Hilt的使用要求。
- 自定义Application类,缓存全局Context实例:
class MyApp : Application() { override fun onCreate() { super.onCreate() globalAppContext = this } companion object { lateinit var globalAppContext: Context private set } }
记得在AndroidManifest.xml的application节点配置android:name=".MyApp"。
2. 直接在异常类中使用全局Context获取入口点:
class IOException : BaseException { @EntryPoint @InstallIn(SingletonComponent::class) interface AnalyticsServiceProviderEntryPoint { fun analyticsService(): AnalyticsService } private val hiltEntryPoint = EntryPointAccessors.fromApplication( MyApp.globalAppContext, AnalyticsServiceProviderEntryPoint::class.java ) val analyticsService = hiltEntryPoint.analyticsService() }
方案2:逻辑剥离(最佳实践)
异常类的核心职责是承载异常信息,不建议在异常类内部耦合业务上报逻辑,你可以调整架构实现解耦:
- 单独实现一个异常上报单例工具类,直接用Hilt构造注入
AnalyticsService - 上层代码捕获到
IOException时,调用上报工具类的方法传递异常信息完成上报
这种方式不需要在异常类中处理任何依赖问题,架构职责更清晰。
内容的提问来源于stack exchange,提问作者Ahmad Shahwaiz
相关产品推荐
相关产品推荐

