android - 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? = ""
)
任何可能导致这种情况的建议将不胜感激。
解决方案
扩展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")
推荐阅读
- c# - 在 C# 中将三个子目录中的文件添加到它们自己的列表中
- c++ - Ret (&)(Args...) 和 Ret (Args...) & 有什么区别?
- java - 无法使用 java 在 selenium 中单击模态弹出关闭链接?
- php - Codeigniter 遇到未捕获的异常
- node.js - 如何为单输出 MLP 设计一个 Tensorflow Js 模型?
- javascript - 检查所有元素中的特定类
- javascript - React/Redux/Reselect - mapStateToProps 即使在看到 reducer 中反映的更改后也会停止触发。
- apache-kafka - spring-cloud-sleuth 与 Zipkin 与 Kafka
- sql - 在 SQL Server 中重新创建 For 循环?
- apache-spark - 写入 Impala 时自动创建 Impala 表的数据框