使用Hilt向AppGlideModule注入OkHttpClient时遇初始化异常
问题解决:Hilt注入OkHttpClient到AppGlideModule失败
问题原因
Glide的AppGlideModule实例是由Glide自身在初始化阶段创建的,并不属于Hilt的依赖注入容器管理范畴。直接使用@Inject lateinit var或者构造注入的方式,Hilt没有机会为这个实例注入依赖,因此会抛出UninitializedPropertyAccessException。
解决方案:使用Hilt EntryPoint获取依赖
通过Hilt提供的EntryPoint机制,我们可以从Application级别的Hilt组件中获取OkHttpClient实例,具体步骤如下:
- 定义EntryPoint接口
创建标记了@EntryPoint和@InstallIn(SingletonComponent::class)的接口,声明获取OkHttpClient的方法:
@EntryPoint @InstallIn(SingletonComponent::class) interface OkHttpClientEntryPoint { fun getOkHttpClient(): OkHttpClient }
- 修正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
相关产品推荐
相关产品推荐

