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

使用Hilt向AppGlideModule注入OkHttpClient时遇初始化异常

问题解决:Hilt注入OkHttpClient到AppGlideModule失败

问题原因

Glide的AppGlideModule实例是由Glide自身在初始化阶段创建的,并不属于Hilt的依赖注入容器管理范畴。直接使用@Inject lateinit var或者构造注入的方式,Hilt没有机会为这个实例注入依赖,因此会抛出UninitializedPropertyAccessException。

解决方案:使用Hilt EntryPoint获取依赖

通过Hilt提供的EntryPoint机制,我们可以从Application级别的Hilt组件中获取OkHttpClient实例,具体步骤如下:

  1. 定义EntryPoint接口
    创建标记了@EntryPoint和@InstallIn(SingletonComponent::class)的接口,声明获取OkHttpClient的方法:
@EntryPoint
@InstallIn(SingletonComponent::class)
interface OkHttpClientEntryPoint {
    fun getOkHttpClient(): OkHttpClient
}
  1. 修正MyGlideModule代码
    首先修正你原代码中@GlideModul的拼写错误(缺少最后一个e,需改为@GlideModule,否则Glide无法识别该模块),然后在registerComponents方法中通过EntryPointAccessors获取依赖:
@GlideModule
@Excludes(OkHttpLibraryGlideModule::class)
class MyGlideModule : AppGlideModule() {

    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        // 从Application上下文获取Hilt的EntryPoint
        val entryPoint = EntryPointAccessors.fromApplication(
            context.applicationContext,
            OkHttpClientEntryPoint::class.java
        )
        val httpClient = entryPoint.getOkHttpClient()
        
        registry.replace(
            GlideUrl::class.java,
            InputStream::class.java,
            OkHttpUrlLoader.Factory(httpClient)
        )
    }
}

关键注意点

  • 必须保证@GlideModule注解拼写正确,否则Glide不会扫描到你的自定义模块,替换OkHttp加载器的逻辑也无法生效。
  • 使用EntryPointAccessors.fromApplication获取Application级别的Hilt组件,与你的OkHttpClient的@Singleton作用域匹配。

内容的提问来源于stack exchange,提问作者lostintranslation

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:25:06