【问题标题】:A function to read data from FireBase but requires Unit instead从 FireBase 读取数据但需要 Unit 的函数
【发布时间】:2018-03-23 01:38:47
【问题描述】:

我创建了一个调用 FireBase 数据库并返回 MutableList 的函数。但是,当我尝试让它在特定行返回时,它说它需要一个 Unit 而不是 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&lt; CustomList &gt; 在第一个返回的课程列表中找到,因为我要求它返回 一个 MutableList 而不是一个单元。我很困惑为什么会发生这种情况。最后一次返回将给出一个空列表。目前这是我在 FireBase 的第一次尝试,这是我正在做的练习。读写规则也已设置为公开。我应该如何重新编码能够将数据从 FireBase 返回到函数并传递回调用者的函数?

【问题讨论】:

  • 那些是异步函数,所以当你“想要”的时候你不能从它们返回。当您的数据准备就绪时(首先是return lessonList),您可以对列表做任何您想做的事情(调用另一个函数,...)。
  • 当您调用 firebaseCollect(key) 时,您的函数正在向 Firebase 数据库发送请求并立即返回,即您的请求是异步处理的。这就是为什么你有回调函数(onDataChangedonCanceled,...),这样当事情发生或完成时你可以得到通知。
  • @StefanGolubović 这些 cmets 听起来像是一个很好的答案的开始! ;-)
  • @FrankvanPuffelen 好吧,我想我应该发布答案,但我的想法是快速提示为什么它不像Blender 认为的那样工作。同时Doug Stevenson给出了很好的答案。 :)

标签: firebase firebase-realtime-database kotlin


【解决方案1】:

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

为了更好地了解您的代码是如何工作的,请将日志行放在不同的位置,并亲自查看调用代码的顺序。您可以通过 reading this article 阅读更多关于为什么 Firebase API 是异步的。底线是您需要使用异步编程技术与异步 API 进行交互。不要试图让它们同步。

【讨论】:

    【解决方案2】:

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

    您在 onDatachange() 中返回 lessonListonDatachange() 的返回类型是 void(Unit in kotlin)这是类型不匹配错误的原因。

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

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 2019-01-10
      • 1970-01-01
      • 2018-04-11
      • 2021-10-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多