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

SharedPrefManager类未初始化实例报错问题求助

解决SharedPrefManager中未初始化实例的报错问题

嘿,我一眼就瞅出问题所在啦!你声明了lateinit var mCtx: Context,但从来没给它赋值啊!这就是为啥调用isLoggedIn()或者username()时会触发未初始化实例的错误~

问题根源

你的私有构造函数接收了context参数,但完全没把它赋值给mCtx变量。当后续方法尝试用mCtx获取SharedPreferences时,这个变量还处于未初始化状态,自然就报错了。

修复方案(附完整代码)

我帮你把代码修复好了,还补充了单例模式的完整实现(毕竟SharedPrefManager通常做成单例更合理),同时优化了内存泄漏的问题:

class SharedPrefManager private constructor(context: Context) {
    // 直接用applicationContext初始化,避免内存泄漏,同时去掉lateinit
    private val mCtx: Context = context.applicationContext

    fun isLoggedIn(): Boolean {
        val sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)
        // 简化判断逻辑
        return sharedPreferences.getString(KEY_USERNAME, null) != null
    }

    fun username(): String {
        val sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)
        // 处理空值,避免编译报错(因为getString返回String?,而方法声明返回String)
        return sharedPreferences.getString(KEY_USERNAME, "") ?: ""
    }

    // 补全单例实现+常量定义
    companion object {
        private const val SHARED_PREF_NAME = "MySharedPref"
        private const val KEY_USERNAME = "username"

        @Volatile
        private var instance: SharedPrefManager? = null

        fun getInstance(context: Context): SharedPrefManager {
            return instance ?: synchronized(this) {
                instance ?: SharedPrefManager(context).also { instance = it }
            }
        }
    }
}

关键修复点说明

  • 初始化mCtx:把之前的lateinit var mCtx改成直接在构造函数里用context.applicationContext初始化,彻底解决未初始化问题,同时用val保证变量不可变,更安全。
  • 避免内存泄漏:使用applicationContext而不是传入的原始context,因为applicationContext是全局生命周期的,不会随Activity/Fragment销毁而被回收,防止内存泄漏。
  • 处理空值:username()方法里,getString返回的是可空类型String?,而你的方法声明返回String,所以必须用?:处理空值,这里给了默认空字符串,你也可以根据业务需求改成抛出异常或者其他逻辑。
  • 完善单例:因为你的类用了私有构造函数,显然是想做成单例模式,所以补全了双重校验锁的单例实现,保证全局只有一个SharedPrefManager实例。

使用方式

之后你需要通过单例方法获取实例,而不是直接创建:

val sharedPref = SharedPrefManager.getInstance(applicationContext)
// 调用方法
val isLoggedIn = sharedPref.isLoggedIn()
val username = sharedPref.username()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:30:46