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
相关产品推荐
相关产品推荐

