我有以下列表,我尝试按日期时间重新排序。
import 'package:intl/intl.dart';
//don't forget to add under dependencies pubspec.yml "intl: ^0.15.8"
List products = [];
//adding into the new list from raw API list
for(final item in rawProducts){
var parsedDate = DateTime.parse.(item['expiryDate']);
tmpArray = {
'id': item['id'],
'name': item['name'],
'price': item['price'],
'expiry': parsedDate
}
products.add(tmpArray);
}
}
List products = [
{id: 1242, name: milk, price: $5, expiry: 2019-11-25 00:00:00:000},
{id: 1242, name: egg, price: $2, expiry: 2019-11-22 00:00:00:000},
{id: 1243, name: bread, price: $3, expiry: 2019-11-22 00:00:00:000},
{id: 1244, name: butter, price: $7, expiry: 2019-11-24 00:00:00:000},
{id: 1247, name: butter, price: $7, expiry: 2019-11-23 00:00:00:000},
]
我想以最远失效日期显示在最前面的方式重新排序列表:
25-11-2019
24-11-2019
23-11-2019
22-11-2019
22-11-2019
我尝试过的(更新)-〉通过将a.expiry
更改为a['expiry']
解决:
products.sort((a,b) {
var adate = a['expiry'] //before -> var adate = a.expiry;
var bdate = b['expiry'] //var bdate = b.expiry;
return -adate.compareTo(bdate);
});
在排序功能上,我收到此错误(通过上述修复解决):
Unhandled Exception: NoSuchMethodError: Class
'_InternalLinkedHashMap<String, dynamic>'has no instance getter 'expiry'.
7条答案
按热度按时间eulz3vhy1#
在上面的示例中,
expiry
是String
,而不是DateTime对象。这里有几个选项,具体取决于您想要实现的目标。最简单的解决方案是使用String内置的
compareTo
方法,它允许对String进行排序,这些时间戳已经是可排序的格式,所以这样做是可行的:或者更简洁一点:
这是非常基本的,就像评论中提到的pskink一样,在此基础上你可以把字符串转换成实际的DateTime对象。
DateTime
也有一个内置的compareTo
方法,因此上面的代码片段可以与DateTimes以及String一起使用。如果您想颠倒顺序,只需交换
a
和b
。pxq42qpu2#
我通过更改
changing a.expiry into a['expiry']
和b.expiry into b['expiry']
修复了此问题tktrz96b3#
转换为日期时间
不转换为日期时间
eblbsuwk4#
如果您遇到类似以下情况:
然后执行以下操作:
或者像我的代码:
Source
kx7yvsdv5#
如果我们更具体的话,试试这个。
对我来说效果很好
b5lpy0ml6#
假设日期和时间为字符串,如果要按特性名称对对象进行排序而不必使用DateTime,请执行以下操作:
kmbjn2e37#
对于我,需要在compareTo之前先执行DateTime.parse
https://www.fluttercampus.com/guide/169/how-to-sort-list-by-date-in-dart-flutter/