Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to sort/order a list by date in dart/flutter?

Tags:

flutter

dart

I have the following list, that I am trying to re-order/ sort by the DateTime.

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},  ] 

I would like to re-order the list in a way that the farthest expiry date shows up first:

 25-11-2019  24-11-2019  23-11-2019  22-11-2019  22-11-2019 

What I have tried (updated) -> SOLVED by changing a.expiry into 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);   }); 

on the sort function I am receiving this error (SOLVED by above fix):

Unhandled Exception: NoSuchMethodError: Class  '_InternalLinkedHashMap<String, dynamic>'has no instance getter 'expiry'. 
like image 949
Manas Avatar asked Jul 12 '19 04:07

Manas


People also ask

How do you sort date and time in flutter?

sort((a,b) => a. compareTo(b)); DateTime expiryAsDateTime = DateTime. parse(expiry);

How do you sort a list in DART?

First we sort the list of objects by field name , then we sort by field age , separately. The second approach is to extend Comparable abstract class and override compareTo() method. Now we don't need to pass compare function, we just call list. sort() instead of list.

How do you sort a timestamp in darts?

The easiest solution would be to use String's built in compareTo method, which allows sorting Strings. Those timestamps are already in a sortable format, so this would work: products. sort((a,b) { return a.


2 Answers

In your example above, expiry is a String, not a DateTime object. You have a few options here, depending on what you want to achieve.

The easiest solution would be to use String's built in compareTo method, which allows sorting Strings. Those timestamps are already in a sortable format, so this would work:

products.sort((a,b) {     return a.compareTo(b);  }); 

Or more concise:

products.sort((a,b) => a.compareTo(b)); 

This is pretty basic. Like pskink mentioned in the comment, building on this you could convert the Strings to actual DateTime objects.

DateTime expiryAsDateTime = DateTime.parse(expiry); 

DateTime also has a built in compareTo method, so the code snippet above would work with DateTimes as well as Strings.

If you want to reverse the order, just swap a and b.

like image 149
MichaelM Avatar answered Nov 06 '22 01:11

MichaelM


I fixed it by changing changing a.expiry into a['expiry'] and b.expiry into b['expiry']

products.sort((a,b) {  var adate = a['expiry'] //before -> var adate = a.expiry;  var bdate = b['expiry'] //before -> var bdate = b.expiry;  return adate.compareTo(bdate); //to get the order other way just switch `adate & bdate` }); 
like image 24
Manas Avatar answered Nov 06 '22 02:11

Manas