调用javax.inject.Provider.get()报空对象引用,Hilt注入配置哪里出错?
问题原因及修复方案
- 拼写错误1:Provider接口名/导入错误
你代码里声明的注入字段类型是Provide<ConfirmationOverlay>,JSR330标准的懒加载Provider接口正确拼写是Provider(末尾多了个r),同时需要确认导入的是javax.inject.Provider包下的接口,错误的类型或包路径不会被Hilt识别注入,导致字段为null,调用get方法自然抛出空指针。
修复后代码:
import javax.inject.Provider; // 类内字段声明 @Inject @MyAnnotation Provider<ConfirmationOverlay> confOverlay;
- 拼写错误2:Module提供方法注解写错
你Module里的提供方法用的是@Provide注解,Hilt/Dagger要求的提供实例注解是@Provides(末尾多了个s),需要确认导入的是dagger.Provides或dagger.hilt.Provides包下的注解,错误的注解或包路径会导致Hilt无法识别这个提供方法,对应类型的实例不会被加入依赖图,自然无法完成注入。
修复后代码:
import dagger.Provides; @Module @InstallIn(ActivityComponent.class) public interface MyModule { @Provides @MyAnnotation public static ConfirmationOverlay provideConfirmation() { return new ConfirmationOverlay(); } }
注入宿主未加Hilt入口注解
你的Module安装在ActivityComponent中,如果你是在Activity里使用这个注入字段,必须在Activity类上添加@AndroidEntryPoint注解;如果是在Fragment里使用,除了Fragment本身加@AndroidEntryPoint,它依附的Activity也必须添加该注解,否则Hilt不会执行注入逻辑,字段保持默认null值。注入方法调用时机过早
如果你在Activity的onCreate方法执行之前(比如Activity构造函数、attachBaseContext方法执行阶段)调用了aMethod,此时Hilt的注入流程还没完成,字段还没被赋值,也会触发空指针。需要保证注入字段的调用时机在onCreate之后。注解依赖错误
确认你自定义注解MyAnnotation上的@Qualifier是javax.inject.Qualifier包下的注解,而非自己定义的同名注解,否则Hilt不会识别为依赖限定符,无法匹配到对应提供方法。
内容的提问来源于stack exchange,提问作者Tajuddin Khandaker
相关产品推荐
相关产品推荐

