Flutter调用API遇String无toDouble方法错误,求解决
解决方案
问题根源是API返回的hacim字段为空字符串时,直接调用.toDouble()会报错——空字符串不是有效的数字格式,String类本身没有toDouble()方法(仅数字格式的字符串可通过double.parse转换)。以下是几种可行的修复方式:
1. 转换时添加空值与解析失败判断,返回默认值
如果业务逻辑允许将空值或无效值转为默认值(比如0.0),可以在fromJson方法中修改转换逻辑:
// 模型类fromJson方法中对应字段的处理 hacim: () { final dynamic value = json['hacim']; if (value is String) { // 空字符串直接返回默认值,非空字符串尝试解析,失败也返回默认值 return value.isEmpty ? 0.0 : double.tryParse(value) ?? 0.0; } // 若返回的是num类型(如int/double),直接转double return (value as num?)?.toDouble() ?? 0.0; }(),
double.tryParse和double.parse的核心区别是:前者解析失败时返回null,不会抛出异常,更适合处理不可靠的API返回数据。
2. 将模型字段改为可空类型(推荐,若业务允许空值)
如果hacim字段本身允许为空,可以把模型中的类型改为double?,这样空字符串或无效值可转为null,由业务层后续处理:
// 模型类定义 class HisseSenedi { final double? hacim; // 其他字段... HisseSenedi({this.hacim, /* 其他参数 */}); factory HisseSenedi.fromJson(Map<String, dynamic> json) { return HisseSenedi( hacim: () { final dynamic value = json['hacim']; if (value is String) { return value.isEmpty ? null : double.tryParse(value); } return (value as num?)?.toDouble(); }(), // 其他字段解析... ); } }
3. 封装通用转换工具函数(复用性更高)
如果多个API都有类似的字符串转数字需求,可以封装一个工具函数:
double? stringToDouble(dynamic value) { if (value is String) { return value.isEmpty ? null : double.tryParse(value); } else if (value is num) { return value.toDouble(); } return null; }
然后在fromJson中直接调用:
hacim: stringToDouble(json['hacim']),
你之前调用其他API无问题,是因为那些接口没有需要从字符串转换为double的字段,不会触发这个解析异常。
内容的提问来源于stack exchange,提问作者Mıktad Tahir Durak
相关产品推荐
相关产品推荐

