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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:40:08