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 属性首选项尚未初始化的主要内容,如果未能解决你的问题,请参考以下文章