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

在Dart中如何基于映射内MyObject的日期对映射列表排序?

解决Dart中Map列表按对象日期排序的问题

你的代码报错的核心原因是:myList是List<Map<String, dynamic>>类型,a['obj']返回的是dynamic类型,Dart编译器无法确定它包含date属性,直接访问.date会触发类型错误。

修复方案

通过类型断言将dynamic类型的obj转换为MyObject,让编译器明确其类型,即可安全访问date属性。

修复后的排序代码

myList.sort((a, b) {
  final objA = a['obj'] as MyObject;
  final objB = b['obj'] as MyObject;
  return objA.date.compareTo(objB.date);
});

完整可运行示例

为了验证排序效果,我们创建不同日期的对象进行测试:

class MyObject{
  DateTime date;
  String myText;

  MyObject({required this.date, required this.myText});
}

void main()
{
  // 创建带不同日期的对象
  MyObject obj1 = MyObject(date: DateTime(2023, 10, 1), myText: "abc");
  MyObject obj2 = MyObject(date: DateTime(2023, 9, 1), myText: "bcd");
  MyObject obj3 = MyObject(date: DateTime(2023, 11, 1), myText: "cde");

  var myList = [
    {"obj": obj1 , "etc": "someEntry1"}, 
    {"obj": obj2, "etc": "someEntry2"},
    {"obj": obj3, "etc": "someEntry3"}
  ];

  // 执行排序
  myList.sort((a, b) {
    final objA = a['obj'] as MyObject;
    final objB = b['obj'] as MyObject;
    return objA.date.compareTo(objB.date);
  });

  // 打印排序结果
  for (var item in myList) {
    print("${(item['obj'] as MyObject).date} - ${item['etc']}");
  }
}

安全优化(可选)

如果你的列表中可能存在obj为null或非MyObject类型的情况,可以添加类型检查避免运行时异常:

myList.sort((a, b) {
  final objA = a['obj'];
  final objB = b['obj'];
  if (objA is MyObject && objB is MyObject) {
    return objA.date.compareTo(objB.date);
  }
  // 处理异常情况:比如返回0视为相等,或根据需求抛出错误
  return 0;
});

内容的提问来源于stack exchange,提问作者BugsBuggy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:55:27