当前位置: 首页 > 知识库问答 >
问题:

返回kotlin[重复]中加载项成功侦听器内的值

干鑫鹏
2023-03-14

我在kotlin中获取函数中的返回类型时遇到了一个问题

功能是

 override suspend fun uploaded_docs_retrival() : ArrayList<String> {

    Firebase.firestore.collection("profiles").whereEqualTo("uid", "$uid").get()
        .addOnSuccessListener { result ->
        for (document in result) {
            val myObject = document.toObject(docretreving::class.java)
            val x = myObject.Docs
        }

    }
    return x
}

在这里,我从Fire store中检索信息,并将其映射到一个对象

但是在上面的函数中,我无法返回x,因为它说x未解析

我的数据类如下:

data class docretreving(
val Docs : ArrayList<String> = arrayListOf<String>()

)

如何编写这样的代码,我可以返回值x,这是一个数组列表从我的函数uploaded_docs_retrival()

编辑以下工作代码:-

override suspend fun uploaded_docs_retrival() : ArrayList<String> {
    return try {
        val result = Firebase.firestore.collection("profiles").whereEqualTo("uid", "$uid").get()
            .await()
        result.first().toObject(docretreving::class.java).Docs
    } catch(e: Exception) {
        Log.e("TAG", "Failed to upload: ${e.message.orEmpty()}")
        ArrayList()
    }
}

共有2个答案

赵君植
2023-03-14

调用wait()而不是添加成功侦听器。将其包装在try/catch中,因为它会在失败时抛出异常。

我不清楚为什么Firestore可以退货多件,而你却只退货一件。我只是在下面的结果中选择第一项:

override suspend fun uploaded_docs_retrival() : ArrayList<String> {
    return try {
        val result = Firebase.firestore.collection("profiles").whereEqualTo("uid", "$uid").get()
            .await()
        require(result.isNotEmpty()) { "No values returned." }
        result.first().toObject(docretreving::class.java).Docs
    } catch(e: Exception) {
        Log.e(TAG, "Failed to upload: ${e.message.orEmpty()}")
        ArrayList() // or you can rethrow or return null if you want
    }
}

如果您没有访问wait()扩展函数的权限,请在内部版本中添加此依赖项。格拉德尔:

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.0"
赏光霁
2023-03-14

您将获得“x未解析”,因为“val x”的范围在for循环中。

您将无法在循环和侦听器之外访问它。

获取字符串列表的最佳方法是将监听器作为参数传递给方法。您也可以传递“成功监听器”来获取值。

覆盖suspend fun Upload\u docs\u retrival(侦听器:SuccessListener)=Firebase。firestore。集合(“配置文件”)。其中,equalto(“uid”,“$uid”)。get()。addOnSuccessListener(侦听器)

 类似资料:
  • 问题内容: 给定布局 有没有一种方法可以将侦听器添加到活动中的任何新“线程”插入中,例如/ activity / * / thread? 当添加了新的活动时,我正在获取这些活动的提要,但是在附加线程时,不会触发任何事件。我是否需要将[thread]部分移到它自己的根目录下,并将线程ID与活动ID匹配,才能知道何时针对主活动线程进行线程注释? 问题答案: 根据您的评论更新答案。 您想听: 与其嵌套,

  • 我有一个有2个元素的回收器视图。我想添加2个按钮来做不同的事情(取决于回收器视图的哪个元素。怎么可能做到这一点?我的元素是文本视图 设置ctiv.kt 我的适配器。kt

  • 这个函数总是返回null. t是不被分配与令牌值.有人能帮助请?

  • 问题内容: 这个问题已经在这里有了答案 : Android-处理EditText中的“ Enter” (28个答案) 5个月前关闭。 如果我有一个EditText,并且我想听用户是否按下了键盘上的“完成”按钮,该如何做? 问题答案: 代码是 在那个“ edittext”是文本字段的ID 查看此链接,只需将setOnKeyListener设置为您的editText即可。

  • 我有jbpm系统(),我想在系统内使用一个全局的。我创建了简单的过程事件lestener: 我的pom。xml: 当我将其添加为部署依赖项并通过工作台将其声明为jbpm项目中的事件监听器时,一切都运行正常。 但是现在我有很多项目,把事件监听器附加到每个项目上很不舒服。因此,我在wildfly中创建了新模块: 已创建部署描述符。xml服务器级别: 因此,当我创建一个新的jbpm进程并通过工作台将其部

  • 问题内容: 这个问题已经在这里有了答案 : 执行功能后,Python脚本返回意外的“无” [重复] (3个答案) 7年前关闭。 输出量 我不想要“无”,那么 如何执行一行代码以返回输入列表中的项目? 我试过了: 但这不起作用,因为return语句不能那样工作 问题答案: 您正在打印的返回码是。只需致电即可。