Flutter中Firebase Map类型字段stockBySize始终返回null问题排查
问题原因及解决方案
核心问题:fromFirestore中stockBySize的类型判断逻辑错误
Firebase Firestore中的Map字段读取后是Map<String, dynamic>类型,并非Iterable类型,你当前代码里用data?['stockBySize'] is Iterable做判断,这个条件永远不成立,导致stockBySize始终返回null。
修复步骤
修正
Product.fromFirestore的类型判断逻辑
将stockBySize的赋值代码改为判断Map类型后转换:stockBySize: data?['stockBySize'] is Map ? Map<String, String>.from(data?['stockBySize']) : null,简化
findProducts代码(可选,更规范)
既然已经使用withConverter,element.data()直接返回转换好的Product对象,无需手动重新构造:Future<List<Product>> findProducts() async { final query = db.collection("products").withConverter( fromFirestore: Product.fromFirestore, toFirestore: (Product product, _) => product.toFirestore(), ); try { final docSnap = await query.get(); final products = docSnap.docs.map((doc) => doc.data()).toList(); log(products.toString()); return products; } on FirebaseException { rethrow; } }
额外检查点
- 确认Firebase中
stockBySize的键值均为字符串类型(你的示例符合要求),若存在数字类型,需在转换时添加toString()处理。 - 确保
Product类的toFirestore方法(未在代码中展示)正确处理stockBySize字段的写入,避免后续数据格式异常。
内容的提问来源于stack exchange,提问作者Adalberto Júnior
相关产品推荐
相关产品推荐

