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
相关产品推荐
相关产品推荐

