在Dart/Flutter中对含列表的Map按paymentDueDate排序
Dart按paymentDueDate对Map中的payments列表排序
问题场景
从JSON响应中获取到如下Map数据:
map = { "status": "Success", "payments": [ { "id": 99, "groupID": 19, "paymentDueDate": "2023-05-12", "paymentDate": null, "userID": 13, "amount": 500, "forDuration": "May", "proofOfPayment": null, "paymentMode": null, "paymentID": null, "paymentToken": null, "approvedBy": null, "approvedAt": null, "status": "pending", "note": "", "created_at": "2023-05-09T03:39:01.000000Z", "updated_at": "2023-05-09T03:39:01.000000Z" } ] };
需要对payments列表按paymentDueDate字段排序,但尝试的代码无法正常工作:
map["payments"].sort( (a, b) => ( a[DateTime.tryParse('paymentDueDate')].compareTo( b[DateTime.tryParse('paymentDueDate')], ), ), );
错误原因
- DateTime解析参数错误:你把字段名
"paymentDueDate"直接传给DateTime.tryParse,这会导致解析出null(字符串"paymentDueDate"不是合法日期格式),后续调用compareTo会抛出空指针异常。正确逻辑是先取出列表项中的paymentDueDate字符串,再解析成DateTime。 - 类型未明确:
map["payments"]的类型是dynamic,直接调用sort可能触发类型警告,建议先转换成明确的List<Map<String, dynamic>>类型。 - 未处理null情况:如果
paymentDueDate存在null值,直接解析后调用compareTo会报错,需要额外处理这类边界情况。
正确解决方案
基础版本(假设paymentDueDate均为非空合法日期)
// 明确类型,避免动态类型警告 List<Map<String, dynamic>> payments = map["payments"] as List<Map<String, dynamic>>; payments.sort((a, b) { // 先取出日期字符串,再解析为DateTime DateTime dateA = DateTime.parse(a["paymentDueDate"]); DateTime dateB = DateTime.parse(b["paymentDueDate"]); return dateA.compareTo(dateB); }); // 将排序后的列表放回原map map["payments"] = payments;
健壮版本(处理paymentDueDate为null或非法格式的情况)
如果存在paymentDueDate为null或格式不合法的情况,可以将这类项统一排在列表末尾:
List<Map<String, dynamic>> payments = map["payments"] as List<Map<String, dynamic>>; payments.sort((a, b) { DateTime? dateA = DateTime.tryParse(a["paymentDueDate"] ?? ""); DateTime? dateB = DateTime.tryParse(b["paymentDueDate"] ?? ""); // 处理null/非法日期:将这类项排在最后 if (dateA == null) return 1; if (dateB == null) return -1; return dateA.compareTo(dateB); }); map["payments"] = payments;
内容的提问来源于stack exchange,提问作者Mbebwo
相关产品推荐
相关产品推荐

