kotlin.UninitializedPropertyAccessException:lateinit 属性首选项尚未初始化

Posted

技术标签:

【中文标题】kotlin.UninitializedPropertyAccessException:lateinit 属性首选项尚未初始化【英文标题】:kotlin.UninitializedPropertyAccessException: lateinit property preferences has not been initialized 【发布时间】:2020-11-01 01:36:18 【问题描述】:

我在我的多个项目中使用了共享偏好的代码,它工作正常,但现在当我在另一个项目中应用相同的代码时,它停止工作。以下是错误

共享偏好代码

object AppPrefrence 
    private const val NAME = "AComputerEngineer"
    private const val MODE = Context.MODE_PRIVATE
    private lateinit var preferences: SharedPreferences

    private val user_id = Pair("user_id","")
    private val ngo_id = Pair("ngo_id","")
    private val IS_LOGIN = Pair("is_login", false)
    private val catagoryName = Pair("Catagory", "")
    private val user_phone = Pair("user_phone", "")


    fun init(context: Context) 
        preferences = context.getSharedPreferences(NAME, MODE)
    
    //an inline function to put variable and save it
    private inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) 
        val editor = edit()
        operation(editor)
        editor.apply()
    
    var userId: String
        get() = preferences.getString(user_id.first, user_id.second) ?: ""
        set(value) = preferences.edit 
            it.putString(user_id.first, value)
        

    var ngoId: String
        get() = preferences.getString(ngo_id.first, ngo_id.second) ?: ""
        set(value) = preferences.edit 
            it.putString(ngo_id.first, value)
        
    //SharedPreferences variables getters/setters
    var isLogin: Boolean
        get() = preferences.getBoolean(IS_LOGIN.first, IS_LOGIN.second)
        set(value) = preferences.edit 
            it.putBoolean(IS_LOGIN.first, value)
        

    var category: String
        get() = preferences.getString(catagoryName.first, catagoryName.second) ?: ""
        set(value) = preferences.edit 
            it.putString(catagoryName.first, value)
        

    var userPhone:String
    get() = preferences.getString(user_phone.first, user_phone.second)?:""
    set(value) = preferences.edit
        it.putString(user_phone.first,value)
    

在变量中设置值

   imgBtn_food?.setOnClickListener(View.OnClickListener 
                var fd = "food"
                catagoryname = fd
                AppPrefrence.category = catagoryname.toString()
                startActivity(Intent(this, Food_Ngo_Activity::class.java))
            )

【问题讨论】:

【参考方案1】:

在访问lateinit 变量之前,您应该是initialized 它。在您的情况下,可以通过调用方法init() 来实现初始化。

所以您的代码如下所示:

AppPrefrence.init(this) // pass your context here
imgBtn_food?.setOnClickListener(View.OnClickListener 
                var fd = "food"
                catagoryname = fd
                AppPrefrence.category = catagoryname.toString()
                startActivity(Intent(this, Food_Ngo_Activity::class.java))
            )

【讨论】:

非常感谢先生回答我它为我工作。但是先生我不明白一件事你能解释一下吗.....我不使用这个 AppPrefrence.init(这个) 在我以前的项目中,但效果很好。是什么原因 @Faiz(问问自己明白)当变量不包含任何内容(未初始化)时,你将如何使用它? 先生,我不知道如何,但如果您愿意,它对我有用,我会向您展示我以前的代码

以上是关于kotlin.UninitializedPropertyAccessException:lateinit 属性首选项尚未初始化的主要内容,如果未能解决你的问题,请参考以下文章