从 firebase 获取数据:lateinit 属性 currentUser 尚未初始化
Posted
技术标签:
【中文标题】从 firebase 获取数据:lateinit 属性 currentUser 尚未初始化【英文标题】:Get data from firebase: lateinit property currentUser has not been initialized 【发布时间】:2022-01-10 04:45:32 【问题描述】:我正在尝试从 Firebase 获取数据并根据该信息做一些事情,但在获取数据之前我的应用程序崩溃了。
我用这段代码获取数据:
private lateinit var currentUser: Student
database.collection("students").document(FirebaseAuth.getInstance().uid!!)
get().addOnCompleteListener
currentUser = it.result!!.toObject(Student::class.java)!!
并且想要这样做:
ex line 31: if(currentUser.group_a)
// do some code
else
// do something else
我得到了这个错误:第 31 行的lateinit 属性 currentUser 尚未初始化
【问题讨论】:
【参考方案1】:问题是对数据库的调用是异步的,并且你的Student对象的初始化会在异步工作完成之后发生。
这里,您在初始化之前尝试访问currentUser
。
if(currentUser.group_a)
// do some code
else
// do something else
要解决您的问题,您可以在初始化后将该代码移到回调中:
private lateinit var currentUser: Student
database.collection("students").document(FirebaseAuth.getInstance().uid!!)
get().addOnCompleteListener
currentUser = it.result!!.toObject(Student::class.java)!!
if(currentUser.group_a)
// do some code
else
// do something else
注意
确保在初始化后对currentUser
进行任何访问,之前不要尝试访问它,因为您会遇到同样的问题。您可以通过将该 Student 对象初始化为 null 并在访问其数据之前对其进行检查来防止崩溃。
提示
确保处理可能的空值,假设您总是会收到带有!!
的非空变量,这不是一个好习惯,请先尝试在这些对象上使用let
来检查它们是否为空。
例子:
FirebaseAuth.getInstance().uid?.let safeUserId ->
database.collection("students").document(safeUserId)
get().addOnCompleteListener
//I'm sure you can do the same for these ;)
currentUser = it.result!!.toObject(Student::class.java)!!
【讨论】:
感谢您的解决方案。我知道这是可行的,但我的目的是使用协程来解决这个问题。 那么你需要在firebase请求上使用.await(),你需要为它导入协程播放服务 请阅读:medium.com/firebase-tips-tricks/… 您提出的当前问题没有“协程”一词,它表示您的变量有问题,这个答案可以解决您的问题。您可以将此标记为正确并创建一个新的以上是关于从 firebase 获取数据:lateinit 属性 currentUser 尚未初始化的主要内容,如果未能解决你的问题,请参考以下文章
无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据