Flutter使用Firebase Firestore出现DocumentSnapshot字段不存在报错
异常排查与解决方案
你遇到的Bad state: field does not exist within the DocumentSnapshotPlatform异常,根本原因是Firestore文档读取时调用的字段名和实际存储的字段名不匹配。
具体问题定位
- 存储逻辑中
updateUserData方法写入强度字段时使用了错拼的srength(缺失字母t) - 读取逻辑中
_coffeeListFromSnapshot方法取值时使用了正确拼写的strength,Firestore中找不到对应字段就抛出该异常 - 你提供的存储结构示例里强度对应的字段名同样是错拼的
srength,可佐证该问题
修复方案
二选一即可,核心是保证存储和读取的字段名完全一致:
方案1:修正存储字段名(推荐,符合命名规范)
修改updateUserData方法的字段拼写:
Future updateUserData(String sugars, String name, int strength) async { return await coffeeCollection.doc(uid).set({ 'sugars': sugars, 'name': name, // 修正字段拼写 'strength': strength, }); }
如果Firestore中已有存量错拼字段的旧数据,可添加兼容逻辑:
List<Coffee> _coffeeListFromSnapshot( QuerySnapshot<Map<String, dynamic>> snapshot) { return snapshot.docs.map((doc) { final data = doc.data(); return Coffee( name: data['name'] ?? '', // 优先读正确字段,兜底读旧错拼字段 strength: data['strength'] ?? data['srength'] ?? 0, sugars: data['sugars'] ?? '0'); }).toList(); }
方案2:适配现有存储的错拼字段
如果不想修改存量数据,直接修改读取逻辑的字段名即可:
List<Coffee> _coffeeListFromSnapshot( QuerySnapshot<Map<String, dynamic>> snapshot) { return snapshot.docs.map((doc) { return Coffee( name: doc.get('name') ?? '', // 适配存储的错拼字段 strength: doc.get('srength') ?? 0, sugars: doc.get('sugars') ?? '0'); }).toList(); }
附加优化建议
给StreamProvider添加异常捕获逻辑,避免未处理异常导致应用崩溃:
StreamProvider<List<Coffee>?>( create: (context) => DatabaseService(uid: 你的用户uid).coffee, initialData: null, catchError: (context, error) { print("数据获取异常: $error"); return []; }, )
内容的提问来源于stack exchange,提问作者Mike Osborn
相关产品推荐
相关产品推荐

