从 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 获取过去 30 天的数据

如何从 Firebase 获取 PWA 数据

无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据

如何从 OnMarkerClickListener 内的 Firebase 数据库中获取特定值?

Firebase 函数从 Firebase DB 获取数据以进行推送通知