You need to enable JavaScript to run this app. Flutter使用Firebase Firestore出现DocumentSnapshot字段不存在报错
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 03:06:03