在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
相关产品推荐
相关产品推荐

