Ordenando lista de objetos por valor de uma propriedade. (#dart, #flutter)
Overview
Olá, desenvolvedores! Já se pegaram precisando ordenar listas de objetos em Dart com base em uma propriedade específica? Hoje, vamos desmistificar esse processo com um exemplo prático, focando em datas. Da preparação da sua massa de teste à implementação da ordenação crescente e decrescente, este post é sua parada certa para entender o assunto profundamente. Acompanhe!
O código deste post demonstra como fazer uma ordenação crescente ou decrescente de uma lista, utilizando o valor de uma propriedade como parâmetro.
Spoiler alert: É basicamente igual você faria com JS.
Para os exemplos, utilizarei a classe abaixo como objeto alvo. Ela possui uma propriedade que é um DateTime e vou utilizar o valor dela para fazer a ordenação da lista.
class Event {
final DateTime createdAt;
final String description;
const Event({this.description, this.createdAt});
}
Demonstrando a ordenação
Para demonstrar que a lista foi ordenada, criei a função abaixo:
void printEventList(List<Event> events) {
events.forEach((event) => print('Event: ${event.description} - ${event.createdAt.toIso8601String()}'));
}
O que ela faz é passar por cada item da lista e fazer um print das propriedades do objeto. Até o momento, nada demais.
Massa de teste
//Dates.
final today = DateTime.now();
final yesterday = today.subtract(Duration(days: 1));
final tomorrow = today.add(Duration(days: 1));
//Events to sort.
final List<Event> events = [
Event(description: 'tomorrow', createdAt: tomorrow),
Event(description: 'yesterday', createdAt: yesterday),
Event(description: 'today', createdAt: today),
];
A massa de teste que utilizarei é essa. Uma lista com 3 objetos, um representando um evento que ocorreu ontem, outro evento que ocorreu hoje e um evento que ocorrerá amanhã.
Ordenando a lista
print('---\nSort: ASCENDING');
events.sort((a,b) => a.createdAt.isAfter(b.createdAt)? 1: -1);
printEventList(events);
print('---\nSort: DESCENDING');
events.sort((a,b) => a.createdAt.isAfter(b.createdAt)? -1: 1);
printEventList(events);
Para ordenar a lista, você deve utilizar o método sort, que recebe uma função com dois parâmetros (A e B) e compara os dois. Se o primeiro parâmetro (A) tiver precedência sobre o segundo (B), então você retorna 1, caso contrário, retorna -1.
Explicando um pouco melhor…
- O que a função sort recebe: (a,b) => [comparação]
- Nesta comparação, estou verificando se a data de criação do evento (a.createdAt) vem depois da data de criação do segundo objeto (b.createdAt).
- Se eu quiser organizar a lista em ordem CRESCENTE, caso a data do primeiro parâmetro (a.createdAt) vier depois da data do segundo parâmetro (b.createdAt), vou retornar 1. Desta forma, as datas mais recentes vão sempre ficar no inicio da lista.
- Se eu quiser organizar a lista em ordem DECRESCENTE, caso a data do primeiro parâmetro (a.createdAt) vier depois da data do segundo parâmetro (b.createdAt), vou retornar -1. Desta forma, as datas mais antigas vão sempre ficar no inicio da lista.
É isso. Não é complicado… Se quiser ver este exemplo funcionando, coloquei o código no meu Github.
Espero ter ajudado.