首页 > 解决方案 > UnitialisedPropertyAccessException 即使在初始化了 lateinit var 之后?

问题描述

我遇到了一些以前没有遇到过的 Kotlin 代码问题。

在一项活动中,我声明了一个后期初始化变量:

lateinit var currentUser : User

然后初始化它。我知道它已初始化,因为我在初始化后使用了 isInitialized 方法进行了仔细检查:

private fun instantiateUser(name : String?, email : String?, flatId : String?) {
    currentUser = User(name, email, flatId)
    if(::currentUser.isInitialized) {
        Toast.makeText(this@HomeActivity, "Initialised", Toast.LENGTH_SHORT).show()
    } else {
        Toast.makeText(this@HomeActivity, "Not initialised", Toast.LENGTH_SHORT).show()
    }
}

我得到了预期的输出,所以我知道 currentUser 已初始化。但是,当我稍后从直接在此之后运行的活动中调用时,我在这一行得到 UnitializedPropertyAccessException:

var currentUser = HomeActivity().currentUser

这是相关的用户类:

@IgnoreExtraProperties
data class User(
    var name: String? = "",
    var email: String? = "",
    var flat: String? = ""
)

任何可能导致这种情况的建议将不胜感激。

标签: androidkotlin

解决方案


扩展zsmb13的答案:

实际上,您不应该实例化活动,这是由系统完成的。如果您想将 User 对象传递给另一个 Activity,最简单的方法是利用 Kotlin 的内置功能并将您的 User 打包,使其看起来像:

@Parcelize
@IgnoreExtraProperties
data class User(
        var name: String? = "",
        var email: String? = "",
        var flat: String? = ""
) : Parcelable

将其传递给另一个 Activity(是指HomeActivity):

val i = Intent(this, SecondActivity::class.java).putExtra("YOUR_KEY", currentUser)
startActivity(i)

并在您的第二个活动中获取它,例如onCreate()

val user: User? = intent?.getParcelableExtra("YOUR_KEY")

推荐阅读