如何解决Flutter中Bad state: cannot get a field on a DocumentSnapshotPlatform报错
错误原因
Error: Bad state: cannot get a field on a DocumentSnapshotPlatform which does not exist 报错本质是代码尝试读取Cloud Firestore文档中不存在的字段,比如某条vendor/boys/Admin文档缺少你要访问的字段,直接取值时就会触发异常
排查修复步骤
- 第一步:核对Firestore控制台字段和代码逻辑是否一致
检查项目用到的slider、vendors、category、boys、Admin五个集合下的所有文档,确认没有缺失代码中用到的字段:- Admin集合的文档要包含调用
getAdminCredentials后读取的全部字段 - vendors集合的所有文档必须存在
accVerified、isTopPicked字段 - boys集合的所有文档必须存在
accVerified字段
有缺失的话手动在Firestore控制台补全字段,或者写代码给历史旧数据批量补充默认值。
- Admin集合的文档要包含调用
- 第二步:给字段取值逻辑加空校验/默认值
不要直接用snapshot['fieldName']无校验取值,改成先判断字段是否存在,或者指定默认值,示例写法:// 错误写法,字段不存在直接报错 bool accVerified = snapshot['accVerified']; // 正确写法1:先判断字段是否存在 bool accVerified = snapshot.exists && snapshot.data().toString().contains('accVerified') ? snapshot['accVerified'] : false; // 正确写法2:用get方法指定不存在时的默认值 bool accVerified = snapshot.get('accVerified') ?? false; - 第三步:检查数据写入、读取的字段名拼写是否一致
核对代码中set/update写入时的字段名,和读取时的字段名是否完全匹配,注意大小写、拼写误差,比如把accVerified误写为AccVerified就会触发字段不匹配报错。 - 第四步:校验文档id参数正确性
确认调用getAdminCredentials等查询方法时传入的文档id,对应Firebase控制台中真实存在的文档,避免传错id读取到不存在、或者字段不完整的文档。 - 第五步:排查依赖冲突
当前依赖中同时引入了Flutter官方维护的cloud_firestore和JS侧包装的firebase: ^9.0.1包,两个包都包含Firestore相关实现,容易出现操作冲突,建议移除firebase: ^9.0.1依赖,全部使用官方flutterfire系列包操作Firebase服务。
快速定位方法
在所有读取DocumentSnapshot的位置加日志输出完整文档数据,可直接定位是哪个文档、哪个字段缺失:
DocumentSnapshot snapshot = await doc.get(); print("当前文档完整数据:${snapshot.data()}");
内容的提问来源于stack exchange,提问作者Muhammad Arafat
相关产品推荐
相关产品推荐

