You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase QuerySnapshot转Kotlin列表及MutableList数据添加失败问题

问题解决方案

1. 核心错误定位

你当前代码的主要问题是误用了MutableList的add方法:你调用的add(valorInt, num.data["concept"].toString())是列表的「插入到指定索引」重载方法,而非创建Task实例并添加到列表的操作。同时还有整数提取效率低、字段名匹配可能出错的问题。

2. 分步修正

(1)正确创建Task对象并添加

先实例化Task类,再将对象添加到列表,替代原来错误的add调用:

// 错误写法
// tasksnew.add(valorInt,num.data["concept"].toString())

// 正确写法
tasksnew.add(Task(valorInt, num.data["concept"].toString()))

(2)优化整数提取逻辑

Firebase中存储的整数通常以Long类型返回,无需先转String再转Int,直接转换更安全高效:

// 替代原有的String转Int逻辑
val valorInt: Int? = num.getLong("value")?.toInt()
// 若字段可能为null,可添加默认值或跳过当前文档
val safeValorInt = valorInt ?: continue // 为null时跳过当前循环

(3)统一字段名规范

你的Task类第二个参数是大写的Concept,但代码中读取的是小写的concept,要确保Firebase文档中的键名与代码一致。建议修改Task类参数名符合Kotlin命名规范:

data class Task(val value: Int, val concept: String)

3. 完整修正代码

data class Task(val value: Int, val concept: String)

val tasksnew = mutableListOf<Task>()
val docRef = db.collection("requisiciones")
    .get()
    .addOnSuccessListener { snapshot ->
        for (document in snapshot) {
            Log.i("yefer", "${document.data["value"]}")
            // 安全提取整数,避免类型转换异常
            val valorInt = document.getLong("value")?.toInt() ?: continue
            Log.i("yefer", "vamos por mas ${valorInt.toString()}")
            // 获取concept字段,为空时设默认值
            val concept = document.data["concept"].toString().ifEmpty { "未知" }
            // 添加Task实例到列表
            tasksnew.add(Task(valorInt, concept))
        }
        // 验证列表是否添加成功
        Log.i("yefer", "已添加${tasksnew.size}条任务数据")
    }

额外注意事项

  • 处理Firebase数据时务必考虑字段为null的情况,用?:运算符做兜底处理,避免空指针异常。
  • 你已经正确初始化了MutableList<Task>,无需额外转换即可直接进行添加、删除等操作。

内容的提问来源于stack exchange,提问作者Yeferson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:22:50