Firebase实时数据库转模型报错:FormatException及优化方案咨询
问题分析与解决方案
错误原因
你遇到的FormatException: Invalid radix-10 number是因为代码遍历了根节点的所有子节点(包括v字段),而v并不是一个种族对象,当尝试访问它的id等字段时会得到null,将null转成字符串后再解析整数就会抛出这个错误。
修复步骤
1. 定位正确的数据节点
首先要确保你遍历的是races节点下的子元素,而不是根节点的所有子元素:
List<RaceModel> racesList = event.snapshot.child('races').children .map((element) => RaceModel.fromDataSnapshot(element)) .toList();
2. 优化模型转换逻辑
原代码中反复调用child()并强制转字符串后再解析的方式既繁琐又容易出错,直接将快照值转为Map并利用Firebase原生类型处理会更可靠,同时增加空安全处理:
factory RaceModel.fromDataSnapshot(DataSnapshot snapshot) { final data = snapshot.value as Map<String, dynamic>? ?? {}; return RaceModel( name: data['name'] as String? ?? '', id: data['id'] as int? ?? 0, raceClass: data['raceClass'] as String? ?? '', subClass: data['subClass'] as String? ?? '', description: data['description'] as String? ?? '', isActive: data['isActive'] as bool? ?? false, basicUnitName: data['basicUnitName'] as String? ?? '', basicUnitOff: data['basicUnitOff'] as int? ?? 0, basicUnitDef: data['basicUnitDef'] as int? ?? 0, basicUnitCost: data['basicUnitCost'] as int? ?? 0, ); }
- 直接将
snapshot.value转为Map<String, dynamic>,避免多次调用child() - 使用空合并运算符
??为可能缺失的字段提供默认值,防止空指针异常 - 利用Firebase返回的原生类型(如int、bool),省去不必要的字符串转换和解析
更优实现建议
如果你的项目中有多个模型需要转换,推荐使用json_serializable包来自动生成序列化/反序列化代码,减少手动编写转换逻辑的工作量,同时提升代码可维护性。
内容的提问来源于stack exchange,提问作者Trax
相关产品推荐
相关产品推荐

