Ordenando lista de objetos por valor de uma propriedade. (#dart, #flutter)

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…

  1. O que a função sort recebe: (a,b) => [comparação]
  2. 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).
  3. 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.
  4. 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.

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dart/Flutter, Dev and tagged , , , , .

One Comment

  1. Pingback: Manipulando listas com #Dart. (#dev #flutter) – Raccoon Ninja

Comments are closed.