Flutter中如何处理Firestore文档可能存在也可能不存在某字段的情况
错误原因排查
第一个NoSuchMethodError报错原因
你当前使用的cloud_firestore版本中,_JsonDocumentSnapshot的data是属性,直接返回Map类型的文档数据,不是可调用的方法。你写的snapshot.data()相当于对Map属性执行调用操作,自然会抛出没有call实例方法的错误。
第二个StateError未捕获原因
直接用[]读取文档中不存在的字段时,Firestore会抛出StateError类型的错误,这个类继承自Error而非Exception,你的代码中仅用on Exception catch只会捕获Exception子类,所以无法捕获到这个错误,也就不会走默认值赋值逻辑。
正确实现方案
方案1:提前判断字段是否存在(最稳妥,无额外性能开销)
先读取整个文档数据,判断目标字段是否存在后再取值:
// 先转换文档数据格式,做空安全处理 final Map<String, dynamic>? docData = snapshot.data as Map<String, dynamic>?; // 确认文档不为空且包含目标字段时直接取值,否则赋值默认值 wpUserProfile.signupMethod = docData?.containsKey("signupMethod") == true ? docData!["signupMethod"] as String : "Email";
方案2:调整异常捕获范围
如果要沿用异常捕获的写法,去掉on Exception限定,捕获所有类型的错误即可:
try { wpUserProfile.signupMethod = snapshot.data["signupMethod"] as String; } catch (_) { wpUserProfile.signupMethod = "Email"; }
方案3:适配新版Firestore API(可选)
如果你后续升级到cloud_firestore 2.0+版本,data变为可调用方法,此时可以用空安全运算符更简洁的实现:
final docData = snapshot.data(); wpUserProfile.signupMethod = (docData?["signupMethod"] as String?) ?? "Email";
该版本中用[]读取不存在的字段会直接返回null,不会抛出错误,配合??运算符可以直接设置默认值。
内容的提问来源于stack exchange,提问作者edn
相关产品推荐
相关产品推荐

