我已经创建了一个调用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返回到函数并传递回调用者的函数?
答案 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。