Android使用Hilt注入SharedPreferences类报lateinit未初始化错误
Hilt注入lateinit未初始化问题排查与修正
触发崩溃的核心原因
你当前代码的崩溃根源是依赖调用的时机错误:
Hilt对标注@AndroidEntryPoint的Activity,其依赖注入动作是在super.onCreate()的内部链路中完成的。你在代码里把AppCompatDelegate.setDefaultNightMode(sessionManager.getTheme())写在了super.onCreate()之前,此时Hilt还没有执行注入流程,被@Inject标记的sessionManager变量完全没有被赋值,自然触发lateinit变量未初始化的异常。
可优化的冗余配置
现有实现存在重复配置的问题,不影响运行但属于无效代码:
- 你的
SessionManager构造函数已经添加了@Inject注解,Hilt本身就可以自动识别这个类、结合已提供的SharedPreferences参数完成实例创建,根本不需要在AppModule里手动编写provideSessionManager方法做依赖提供,这段配置可以直接删除。
必做的前置校验项
如果调整顺序后依然报错,可以按照以下顺序排查:
- 确认自定义的Application类已经添加
@HiltAndroidApp注解——这是Hilt整个注入链路的入口,缺少这个注解时所有注入流程都不会启动 - 确认项目已经正确配置Hilt的注解处理器、依赖引入,避免编译期跳过注入逻辑
修正后的代码实现
- 调整Activity内代码的执行顺序
@AndroidEntryPoint class TrendingRepoActivity : BaseActivity(), View.OnClickListener { private lateinit var viewModel: TrendingRepoViewModel private lateinit var binding: ActivityTrendingReposBinding @Inject lateinit var sessionManager: SessionManager override fun onCreate(savedInstanceState: Bundle?) { // 必须先执行super.onCreate,完成Hilt的注入动作 super.onCreate(savedInstanceState) // 注入动作完成后,再使用被注入的依赖 AppCompatDelegate.setDefaultNightMode(sessionManager.getTheme()) binding = DataBindingUtil.setContentView(this, R.layout.activity_trending_repos) setSupportActionBar(binding.appBarLayout.toolbar) binding.errorView.retryBtn.setOnClickListener(this) init() } }
- 简化AppModule的冗余配置
@Module @InstallIn(SingletonComponent::class) object AppModule { @Singleton @Provides fun provideSharedPreferences(@ApplicationContext context: Context) = context.getSharedPreferences( Constants.PREF_NAME, Context.MODE_PRIVATE ) }
这里不需要额外提供
SessionManager实例,因为带@Inject构造函数的类会被Hilt自动纳入依赖图:Hilt在创建SessionManager时,会自动从依赖图中匹配已提供的SharedPreferences参数,完成实例创建和单例生命周期管理。补充说明:如果确实需要在
super.onCreate()之前设置夜间主题,此时无法通过Hilt注入的实例读取配置,可以临时通过直接读取SharedPreferences的方式获取主题值,等注入流程完成后再使用注入的实例做后续的读写操作。
内容的提问来源于stack exchange,提问作者Shayan khan
相关产品推荐
相关产品推荐

