从FireBase读取数据但需要Unit的功能

时间:2018-03-22 16:44:13

标签: firebase firebase-realtime-database kotlin

我已经创建了一个调用FireBase数据库并返回MutableList的函数。但是,当我尝试使其返回特定行时,它表示它需要一个单元而不是MutableList。

fun firebaseCollect(key: String): MutableList<CustomList> {

    var ref = FirebaseDatabase.getInstance().getReference(key)
    var lessonList = mutableListOf<CustomList>()

    ref.addValueEventListener(object: ValueEventListener{
          override fun onCancelled(p0: DatabaseError?) {
          }

          override fun onDataChange(p0: DataSnapshot?) {
              if (p0!!.exists()) {
                  lessonList.clear()
                  for (index in p0.children) {
                      val lesson = index.getValue(CustomList::class.java)
                      lessonList.add(lesson!!)
                  }
                  return lessonList
              }
          }
    })

    return lessonList
}

Type mismatch. Required: Unit, Found: MutableList< CustomList >在第一个返回lessonList中找到,因为我要求它返回一个MutableList而不是一个单元。我很困惑为什么会这样。最后一次返回会给出一个空列表。这是我在FireBase上的第一次尝试,这是我正在做的一种做法。读写规则也已公开。我应该如何重新编写我能够将数据从FireBase返回到函数并传递回调用者的函数?

2 个答案:

答案 0 :(得分:2)

Firebase API是异步的。对于您的情况,这意味着addValueEventListener立即返回。然后,一段时间后,您传递给它的侦听器将使用您正在查找的数据进行调用。回调中的return语句实际上并不向调用者返回任何数据。实际上,您无法从该回调中返回任何内容。在函数的底部,当你return lessonList时,你实际上是将一个最初为空的列表返回给调用者,这可能会在数据最终到达时更改。

为了更好地了解代码的工作原理,将日志行放在不同的位置,并亲自查看调用代码的顺序。您可以通过reading this article详细了解Firebase API异步的原因。最重要的是,您需要使用异步编程技术与异步API进行交互。不要试图让它们同步。

答案 1 :(得分:1)

数据是从Firebase异步加载的。获取数据后,将调用方法onDatachange()

您将在onDatachange()内返回lessonList。返回类型onDatachange()void (单位为kotlin)这是类型不匹配错误的原因。

要从方法onDatachange()返回结果,请尝试this