【问题标题】:Get data from firebase: lateinit property currentUser has not been initialized从 firebase 获取数据:lateinit 属性 currentUser 尚未初始化
【发布时间】: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 尚未初始化

【问题讨论】:

    标签: android firebase kotlin kotlin-coroutines


    【解决方案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(),你需要为它导入协程播放服务
    • 您提出的当前问题没有“协程”一词,它表示您的变量有问题,这个答案可以解决您的问题。您可以将此标记为正确并创建一个新的
    猜你喜欢
    • 2017-03-03
    • 1970-01-01
    • 2020-12-31
    • 2021-06-11
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多