
Deyv @deyv 1 year ago Conteúdo muitoo bom, parabéns!!

Carlos Bat... @carlosbatista.dev 1 year ago @deyvison Muito obrigado!
Trabalhe com método sort de forma prática. Manipulando listas no Dart.
O uso de listas é muito recorrentes para quem trabalha com desenvolvimento, elas aparecem de várias formas no nosso dia a dia, um exemplo é o mapeamento de uma requisição, onde precisamos utilizar uma lista.
Recomendamos que para essa leitura você possua os conceitos básicos de programação, caso você ainda esteja no início de sua jornada e ainda não conhece sobre listas, recomendamos que de uma revisada antes de continuar.
Caso você já esteja preparado e conheça um pouco sobre o que estamos abordando, se ajeite na cadeira, aperte os cintos e vamos lá!
No exemplo abaixo, temos uma lista de Strings que foi nomeada de "listaDeComidas", o conteúdo dessa lista são diversos values representados por tipos de comida.
List<String> listaDeComidas = [ "Bolo de chocolate", "Suco de laranja", "Coxinha", "Pão de queijo", "Suco de abacaxi", "Bolo de laranja", "Pizza de 4 queijos" ];
Muito simples né?!
Agora vamos fazer algumas mudanças nessa lista.
Vamos supor que precisamos organizar essa lista, podemos utilizar o método sort , ele é um método de lista que recebe uma função, e utiliza os parâmetros (a, b) para que seja feita uma condição de comparação dentro dessa lista.
Então vamos ver um exemplo prático:
Nessa situação vamos manipular a lista para que todos alimentos que comecem com a palavra 'suco' fiquem em primeiro lugar.
List<String> comidas = [ "Bolo de chocolate", "Suco de laranja", "Coxinha", "Pão de queijo", "Suco de abacaxi", "Bolo de laranja", "Pizza de 4 queijos" ]; print(comidas); comidas.sort((a, b) { ///Logo abaixo é utilizado o método de String chamado startsWith que simplesmente verifica se a String começa com o informação que eu passei no seu construtor ('Suco'); return b.startsWith('Suco') ? 1 : -1; }); print(comidas);
O resultado desse código será:
[Bolo de chocolate, Suco de laranja, Coxinha, Pão de queijo, Suco de abacaxi, Bolo de laranja, Pizza de 4 queijos] [Suco de abacaxi, Suco de laranja, Bolo de chocolate, Coxinha, Pão de queijo, Bolo de laranja, Pizza de 4 queijos]
Uma característica do método sort é que ele não irá retornar uma cópia modificada da lista, ele vai alterar totalmente a lista que foi referenciada atribuindo uma nova ordem aos valores.
No exemplo abaixo criamos uma cópia da lista para que ela seja manipulada, e não altere os valores da lista original após utilizamos o método sort.
List<String> comidas = [ "Bolo de chocolate", "Suco de laranja", "Coxinha", "Pão de queijo", "Suco de abacaxi", "Bolo de laranja", "Pizza de 4 queijos" ]; print('Comidas: $comidas'); //Abaixo estamos criando uma nova lista para utilzarmos, usando como base a lista original List<String> comidasFiltradas = comidas.toList(); comidasFiltradas.sort((a, b) { return b.startsWith('Suco') ? 1 : -1; }); print('Comidas: $comidas'); print('Comidas Filtradas: $comidasFiltradas');
O resultado do código acima será esse, a lista original com seu conteúdo intacto, e a nova lista
respeitando a condição definida no sort.
Devemos notar que ao criar uma nova lista no momento da atribuição necessitamos utilizar o .toList(), para que seja retornada uma nova lista, e não apenas uma referência da original.
Exemplo com .toList().
Comidas: [Bolo de chocolate, Suco de laranja, Coxinha, Pão de queijo, Suco de abacaxi, Bolo de laranja, Pizza de 4 queijos] Comidas: [Bolo de chocolate, Suco de laranja, Coxinha, Pão de queijo, Suco de abacaxi, Bolo de laranja, Pizza de 4 queijos] Comidas Filtradas: [Suco de abacaxi, Suco de laranja, Bolo de chocolate, Coxinha, Pão de queijo, Bolo de laranja, Pizza de 4 queijos]
Exemplo sem .toList().
Comidas: [Bolo de chocolate, Suco de laranja, Coxinha, Pão de queijo, Suco de abacaxi, Bolo de laranja, Pizza de 4 queijos] Comidas: [Suco de abacaxi, Suco de laranja, Bolo de chocolate, Coxinha, Pão de queijo, Bolo de laranja, Pizza de 4 queijos] Comidas Filtradas: [Suco de abacaxi, Suco de laranja, Bolo de chocolate, Coxinha, Pão de queijo, Bolo de laranja, Pizza de 4 queijos]
Ele alterou a nossa lista Comidas sendo que nós modificamos apenas a lista Comidas Filtradas. Mas isso acontece devido nós termos apenas "duplicado" a referência da lista principal, sendo assim Comidas Filtradas continua sendo a mesma lista de Comidas, apenas em outra posição de memória, como uma "cópia".
Modelagem de dados no contexto, é quando você precisa utilizar informações que estão em um outro formato como JSON ou XML e converte-los em uma classe de modelo para utilizar em seu projeto.
O map é um método que modifica (conforme os critérios passados) os valores da lista em que ele foi chamado retornando um Iterable que você pode transformar em lista, simplesmente chamando o método .toList().
Iremos utilizar o mesmo exemplo da aula passada, com uma lista de comidas:
List<String> listaDeComidas = [ "Bolo de chocolate", "Suco de laranja", "Coxinha", "Pão de queijo", "Suco de abacaxi", "Bolo de laranja", "Pizza de 4 queijos" ];
Agora utilizaremos o método .map para retornar uma lista a partir da lista que foi criada.
final comidas = listaDeComidas.map((comida) { return { "criadoEm": DateTime.now(), "comida": comida, }; }); print(comidas.toList());
No código acima, temos uma lista de mapas com duas chaves e seus respectivos valores.
Chave 1 : "criadoEm" que recebe o método DateTime.now().
Chave 2 : "comida" que recebe o nome da comida que ele buscará na lista.
O resultado desse código será:
[{criadoEm: 2022-03-14 18:57:55.413, comida: Bolo de chocolate}, {criadoEm: 2022-03-14 18:57:55.413, comida: Suco de laranja}, {criadoEm: 2022-03-14 18:57:55.413, comida: Coxinha}, {criadoEm: 2022-03-14 18:57:55.413, comida: Pão de queijo}, {criadoEm: 2022-03-14 18:57:55.413, comida: Suco de abacaxi}, {criadoEm: 2022-03-14 18:57:55.413, comida: Bolo de laranja}, {criadoEm: 2022-03-14 18:57:55.413, comida: Pizza de 4 queijos}]
Chegamos nesse resultado porque o map pede uma função, e como parâmetro dessa função, o index da lista que está sendo usada como referencia, no nosso caso a lista de referencia é a listaDeComidas, para facilitar, veja como ficaria usando o for:
final comidas = []; for (String comida in listaDeComidas) { comidas.add({ "criadoEm": DateTime.now(), "comida": comida, }); } print(comidas);
O resultado seria o mesmo! Ambos percorre os valores da lista e atribui a uma variável, no nosso caso a variável é comida, agora vamos usar o map para modelar uma classe.
class Comida { final String name; Comida({required this.name}); @override String toString() { return "Comida(name: $name)"; } }
Criamos essa classe Comida e vamos criar uma instancia dela para cada valor da nossa listaDeComidas, veja:
final comidas = listaDeComidas.map((comida) { return Comida(name: comida); }); print(comidas.toList());
O resultado:
[Comida(name: Bolo de chocolate), Comida(name: Suco de laranja), Comida(name: Coxinha), Comida(name: Pão de queijo), Comida(name: Suco de abacaxi), Comida(name: Bolo de laranja), Comida(name: Pizza de 4 queijos)]
Agora comidas se tornou o tipo da lista, deixando de ser do tipo String como é o caso da listaDeComidas.
O map é muito importante quando se trabalha com listas, ainda mais quando se trabalha com requisições em uma API.
Geralmente o retorno de uma requisição pode ser muito grande como:
{ "users": [ { "id": 1, "nome": "Roronoa", "idade": 34, "poderes": [ "lutar com espadas", "velocidade", ], ... } ], }
E se podemos digitar alguma chave errada ao tentar acessar um valor, por exemplo:
users.first["poderes "];
Isso iria resultar em erro, por conta do espaço entre a palavra "poderes " e suas aspas, logo o retorno seria nulo (null), pois não seria possível encontrar essa chave dentro do map.
Caso estivesse dentro de uma classe, não seria possível cometer esse tipo de erro, pois o auto-complete de sua IDE (VsCode, Android Studio entre outros) irão acusar erro.
O acesso seria feito da seguinte forma dentro de uma classe:
users.first.poderes;
Dessa forma, o código fica visualmente mais agradável e também facilita a leitura.
Utilize o sort para organizar suas listas por ordem alfabética, por tamanho, por data, por número ou conforme suas necessidades, é um método muito versátil que vai lhe ser útil sempre.
Na próxima falaremos sobre outro método muito utilizado o MAP, agradecemos sua leitura e nos vemos em breve.
Para saber mais sobre o método sort, acesse a documentação: sort method
Editado por: felipelemos
Um gerenciador de estado simples e eficiente!