Flutter从Firebase取数据生成饼图报错:类型转换失败问题
解决Flutter中Firebase数据转换的CastError问题
错误原因
你遇到的_CastError核心原因是:新版cloud_firestore包中,DocumentSnapshot的data已经从属性改为方法。你当前代码里直接调用documentSnapshot.data拿到的是方法本身(类型为() => Map<String, dynamic>?),而非执行方法后返回的文档数据Map,因此类型转换失败。
修复步骤
1. 修正数据获取方式
将documentSnapshot.data改为documentSnapshot.data(),并处理可能的空值:
Widget bulidChart(BuildContext context) { return StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance.collection("chart").snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) { return LinearProgressIndicator(); } else { List<Cal> cal = snapshot.data!.docs .map((documentSnapshot) { // 调用data()方法获取文档数据,而非直接引用属性 final docData = documentSnapshot.data() as Map<String, dynamic>?; // 处理数据为空的边界情况 if (docData == null) { return Cal("", 0.0, "#000000"); } return Cal.frommap(docData); }) .toList(); return _buildChart(context, cal); } }); }
2. 优化Cal类的类型转换
Firestore中存储的数字可能是int类型,直接赋值给double?会导致潜在类型错误,建议在构造函数中显式转换:
class Cal{ String? foodName; double? kCal; String? colorVal; Cal(this.foodName,this.kCal,this.colorVal); Cal.frommap(Map<String,dynamic>map) :assert(map['foodName']!=null), assert(map['kCal']!=null), assert(map['colorVal']!=null), foodName=map['foodName'] as String, // 将num类型统一转为double kCal=(map['kCal'] as num).toDouble(), colorVal=map['colorVal'] as String; @override String toString()=> "Record<$foodName:$kCal:$colorVal>"; }
额外注意事项
- 确保Firestore集合
chart中的所有文档都包含foodName、kCal、colorVal三个字段,且字段名拼写完全一致(大小写敏感); - 如果允许文档存在缺失字段,可以移除
assert语句,改为空值处理逻辑,避免程序崩溃; - 若饼图仍无法正常渲染,检查
_generateData方法是否正确将Cal列表转换为饼图所需的数据格式。
内容的提问来源于stack exchange,提问作者Ake
相关产品推荐
相关产品推荐

