You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:40:31