Flutter访问Firestore不存在字段报Bad state错误如何解决?
问题原因
你遇到的报错是因为高版本cloud_firestore的get()方法访问不存在的字段会直接抛出异常,不会返回null,而你代码里imageUrl: map.get('imageURL').exist ? map.data()['imageURL'] : ""这行写法本身就有问题,get('imageURL')时如果字段不存在直接触发报错,根本走不到后面的exist判断。
另外低版本的部分cloud_firestore实现中,data()返回的不是标准Dart Map,直接通过[]访问不存在的key也会触发异常,而非返回null。
正确的兼容方案
你只需要先将data()的结果转为标准Dart Map,就可以用普通的Map操作判断字段是否存在、兼容缺失场景:
- 优先通过
containsKey判断字段是否存在 - 直接用
??给缺失字段赋默认值 - 数组类型的字段也要单独做空判断,避免
List.from传入null抛出异常
修改后的
fromJson代码 factory Restaurant.fromJson(QueryDocumentSnapshot snapshot) { // 先转为标准Dart Map final Map<String, dynamic> data = snapshot.data() as Map<String, dynamic>; return Restaurant( restaurantID: data['restaurantID'] ?? "", name: data['name'] ?? "", rating: (data['rating'] as num?)?.toDouble() ?? 0.0, orders: data['orders'] ?? 0, // 数组类型单独判断,字段不存在/为null时赋值空数组 restaurantCtg: data.containsKey('restaurantCtg') ? List<String>.from(data['restaurantCtg']) : <String>[], // 改掉错误的get()写法 imageUrl: data['imageURL'] ?? "", isFeatured: data['isFeatured'] ?? false, address: data['address'] ?? "", availabilityTime: data['availabilityTime'] ?? "09:00-18:00", availableStatus: data['availableStatus'] ?? true, coordinates: data['coordinates'] ?? "", ); }
可选的显式判断字段存在的写法
如果需要明确判断字段是否存在再做特殊逻辑,可以直接用标准Map的containsKey方法:
if (data.containsKey('isFeatured')) { // 字段存在时的逻辑 } else { // 字段不存在时的逻辑 }
内容的提问来源于stack exchange,提问作者Faizan Kamal
相关产品推荐
相关产品推荐

