Flutter模型使用时DateTime类型转换异常的排查与解决
问题:API数据转Hive模型时DateTime字段类型不匹配异常
我在移动应用中通过API获取数据并存储到Hive box时,DateTime字段抛出了类型不匹配的异常。
API返回的原始数据
{"pointOfServiceNo":"3","pointOfServiceName":"DEANO POS 2","pointOfServiceDescription":"DEANO POS 2","pointOfServiceOrderingGroupNo":"113-1","orders":[{"orderType":"inventory","orderDate":"2022-12-08","deliveryDate":"2022-12-08"}]}
抛出的异常
Exception has occurred. _TypeError (type 'String' is not a subtype of type 'DateTime?')
我的Model方法代码
List<Orders> ordersListFromJson(String val) => List<Orders>.from(json.decode(val)['orders'].map((val) => Orders.ordersInfofromJson(val))); @HiveType(typeId: 2) class Orders extends HiveObject { @HiveField(0) String? orderType; @HiveField(1) DateTime? orderDate; @HiveField(2) DateTime? deliveryDate; @HiveField(3) List<Articles>? articles; Orders({this.orderType, this.orderDate, this.deliveryDate, this.articles}); factory Orders.ordersInfofromJson(Map<String, dynamic> orders) => Orders( orderType: orders['orderType'], orderDate: orders[DateTime.tryParse('orderDate')], deliveryDate: orders[DateTime.tryParse('deliveryDate')], articles: List<Articles>.from(orders['articles'] .map((articles) => Articles.articlesfromJson(articles)))); }
问题原因与修复方案
错误点解析
你在解析orderDate和deliveryDate时逻辑完全颠倒了:
- 错误地把字段名
'orderDate'直接传给DateTime.tryParse(),而不是先从orders字典中取出对应的日期字符串值。 - 用解析结果作为key去
orders字典中取值,导致类型彻底不匹配。
修复后的代码
factory Orders.ordersInfofromJson(Map<String, dynamic> orders) => Orders( orderType: orders['orderType'], // 先取出字符串日期,再解析为DateTime对象 orderDate: DateTime.tryParse(orders['orderDate'] ?? ''), deliveryDate: DateTime.tryParse(orders['deliveryDate'] ?? ''), // 增加空判断,避免articles字段不存在时抛出异常 articles: orders['articles'] != null ? List<Articles>.from(orders['articles'].map((articles) => Articles.articlesfromJson(articles))) : null);
额外注意事项
- 加
?? ''是为了防止API返回日期字段为null时,DateTime.tryParse()接收null参数报错。 - 对
articles字段增加空判断,避免API返回的订单数据中没有该字段时触发空指针异常。
内容的提问来源于stack exchange,提问作者Dean Ball
相关产品推荐
相关产品推荐

