Flutter Firebase从Firestore取数组转列表后返回值错误怎么解决
问题根因
- 核心问题是代码没有做异常捕获和类型校验,同时
await与Future.then混用的写法容易隐藏执行异常:- 当目标文档不存在、
userLiked字段未定义时,直接通过下标取值会抛出异常,异常未被捕获的情况下list不会被赋值,后续强制!取值会触发空异常,最终逻辑返回错误的false结果 - 没有做类型匹配校验:如果
userLiked数组中的元素类型和uid类型不一致(比如数组存字符串、uid为数字类型),contains方法也会返回false
- 当目标文档不存在、
修复后代码
Future<bool> checkLiked(String questionID) async { try { // 直接用await获取文档快照,避免作用域取值问题 DocumentSnapshot docSnapshot = await questionBank.doc(questionID).get(); // 先校验文档是否存在 if (!docSnapshot.exists) return false; // 显式转换为字符串列表,字段不存在时默认返回空数组 List<String> likedList = List<String>.from(docSnapshot.get('userLiked') ?? []); // 统一转为字符串后判断是否存在,避免类型不匹配 bool result = likedList.contains(uid.toString()); print(result); return result; } catch (e) { print('获取点赞状态出错:$e'); return false; } }
改动说明
- 去掉
await和then的混用逻辑,直接用await接收异步返回的快照,逻辑更清晰,不会出现内部赋值外部取不到的问题 - 新增文档存在性校验,避免文档不存在时的取值异常
- 显式对
userLiked字段做类型转换,空值场景下默认用空数组兜底,不会出现空指针问题 - 统一将
uid转为字符串后再做匹配,避免两边类型不一致导致的匹配失败 - 新增异常捕获逻辑,网络错误、权限不足等异常场景下不会出现未处理错误,默认返回false
内容的提问来源于stack exchange,提问作者ialyzaafan
相关产品推荐
相关产品推荐

