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.
Latest posts by Breno RdV (see all)
- Estamos de mudança! - abril 28, 2024
- O que é Metaclass e como ela funciona. (#python #dev #metaclass) - janeiro 11, 2023
- Entenda a mágica dos Generators. (#python, #dev, #generator, #iterator) - dezembro 28, 2022
Pingback: Manipulando listas com #Dart. (#dev #flutter) – Raccoon Ninja