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

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的注解处理器、依赖引入,避免编译期跳过注入逻辑

修正后的代码实现

  1. 调整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()
    }
}
  1. 简化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 03:15:03