Manipulando listas no Dart - imagem
Carlos Batista 3 years ago
carlosbatista.dev

Manipulando listas no Dart

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á!


Manipulação de listas

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.


Organizando a 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".


O que é modelagem de dados?

Manipulando listas no Dart: modelagem de dados

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().


Agora vamos aos exemplos:

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.

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.


Considerações finais

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

  • Clique aqui para seguir nosso Instagram e ter os melhores conteúdos sobre programação.
  • Caso queira aprender mais sobre Flutter e Dart se inscreva em nosso canal no YouTube.
4
2.1K
Como um Aplicativo pode transformar sua empresa

Como um Aplicativo pode transformar sua empresa

1724944350.webp
Deyv
2 years ago
Os melhores livros de programação

Os melhores livros de programação

1724944350.webp
Deyv
2 years ago
Como a tecnologia mobile pode impulsionar o faturamento da sua empresa

Como a tecnologia mobile pode impulsionar o faturamento da sua empresa

1724944350.webp
Deyv
1 year ago

Gerenciamento de Estado no Flutter com GetX

Um gerenciador de estado simples e eficiente!

1646920549.png
Carlos Batista
2 years ago
Melhores sites para você aprender programação

Melhores sites para você aprender programação

1724944350.webp
Deyv
2 years ago