Flutter Future方法返回空列表,Firebase拉取数据后返回null问题排查
问题排查与修复方案
核心错误点
- 索引越界异常:Dart中列表为0索引结构,你的循环逻辑
for (int i = 1; i <= foto.docs.length; i++)存在两个问题:- 从索引1开始遍历,直接跳过了排序后的第一条最新照片
- 终止条件为
i <= 列表长度,当i等于列表长度时会访问不存在的索引位,触发RangeError。如果该异常未被上层捕获,会导致函数执行中断,最终返回初始化的空列表
- 筛选规则不合理:
if (foto.docs.length > 1)的判断要求用户至少有2张照片才会执行添加逻辑,若所有查询到的用户照片数都≤1,列表自然不会有数据 - 可选调用侧问题:如果调用该异步方法时未添加
await关键字,拿到的会是Future实例而非解析后的列表,也会出现"返回为空"的假象
修正后的代码
Future<List<String>> takipEdilenlerinFotolariniGetir() async { List<String> fotoUrller = []; // 先判断当前用户是否登录,避免空指针异常 if (FirebaseAuth.instance.currentUser == null) return fotoUrller; Query first = FirebaseFirestore.instance .collection("takiplesme") .doc(FirebaseAuth.instance.currentUser!.uid) .collection('takipEdilenler') .limit(4); var idler = await first.get(); for (var id in idler.docs) { var foto = await FirebaseFirestore.instance .collection('postlar') .doc(id.id) .collection('kullaniciFotograflari') .orderBy('tarih', descending: true) .limit(3) .get(); // 只要有照片就遍历添加,索引从0开始,终止条件为i < 列表长度 if (foto.docs.isNotEmpty) { for (int i = 0; i < foto.docs.length; i++) { String postUrl = foto.docs[i].data()["postUrl"] as String; fotoUrller.add(postUrl); debugPrint("URL $postUrl"); } } } return fotoUrller; }
调用侧注意事项
调用时必须添加await关键字获取解析后的列表:
// 正确调用方式 List<String> urls = await takipEdilenlerinFotolariniGetir(); // 错误调用方式,会拿到Future而非列表 // var urls = takipEdilenlerinFotolariniGetir();
内容的提问来源于stack exchange,提问作者Yalçın Yıldırım
相关产品推荐
相关产品推荐

