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

Flutter中Firebase Realtime Database数据映射到Dart类模型报错如何解决

问题原因

你的getAllRoutines实现存在两处核心错误,直接导致类型匹配异常:

  • 遍历routines节点下的子项时,错误将全量节点数据传入Routine.fromJson方法,而非当前循环对应的单条routine数据
  • 未对Firebase Realtime Database返回的快照值做类型转换,Dart无法直接识别dataSnapshot.value为可遍历的Map<String, dynamic>结构

修复后的代码

Future<List<Routine>> getAllRoutines() async {
  DataSnapshot dataSnapshot = await databaseReference.child('routines/').once();
  List<Routine> routines = [];
  if (dataSnapshot.value != null) {
    // 先将快照值强转为Map结构
    final Map<dynamic, dynamic> routinesMap = dataSnapshot.value as Map;
    routinesMap.forEach((key, value) {
      // 转换单条routine数据为Map<String, dynamic>再传入fromJson
      Routine routine = Routine.fromJson(Map<String, dynamic>.from(value));
      routine.setId(databaseReference.child('routines/$key'));
      routines.add(routine);
    });
  }
  return routines;
}

可选兼容优化(避免后续类型报错)

如果你的数据库中likes、dislikes、number-of-days等字段存储的是数字类型而非字符串类型,需要修改模型类的fromJson方法做类型兼容,例如:

// Routine.fromJson内修改对应字段赋值逻辑
likes = json['likes'].toString();
dislikes = json['dislikes'].toString();
numberOfDays = json['number-of-days'].toString();

同理Day类里的numberOfExercises也做同样处理,避免String类型变量被直接赋值int导致的类型异常。

内容的提问来源于stack exchange,提问作者iulian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:36:03