#3 - Manipulando listas no Dart
Trabalhe com o método where de forma prática
2022-03-15 12:22:50 - Carlos Batista
Olá!
Vamos continuar falando sobre listas, e principalmente como obter itens que atendam uma condição específica.
Então vamos para prática!
Vamos utilizar a seguinte lista:
final tarefas = [ {'title': "Criar uma post sobre listas", "done": false}, {'title': "Recomendar que siga o Instagram da Strawti", "done": false}, {'title': "Fale sobre o YouTube", "done": false}, ];
Temos uma lista simples do tipo List<Map<String, dynamic>>, só que vamos mudar um pouco para melhorar nossa visualização e organização.
Vamos criar uma classe e pode ser em português mesmo, vou chama-la de TarefaModel, o Model no final é apenas para reforçar a responsabilidade dessa classe que é guardar os dados que ela receberá, claro que os dados que estamos usando são o title e done.
Ela deve ficar assim:
class TarefaModel { final String title; final bool done; TarefaModel({ required this.title, this.done=false, }); }
Bem simples né ?
Bom, temos ai os atributos com o final para que não haja alterações nos atributos da classe, mas e como fazemos resolver a questão de alterar a done para true quando quisermos concluir uma tarefa ?
Bom, poderíamos sim tirar o final e alterar diretamente o atributo, porém eu quero mostrar para vocês o copyWith também.
O que vamos manipular?
Agora que temos a lista e o modelo. Vamos preparar tudo para começarmos a brincar com a lista.
void main() { final tarefas = [ TarefaModel(title: "Criar uma post sobre listas"), TarefaModel(title: "Recomendar que siga o Instagram da Strawti"), TarefaModel(title: "Fale sobre o YouTube"), ]; } class TarefaModel { final String title; final bool done; TarefaModel({ required this.title, this.done = false, }); }
Deixei o código completo para você copiar e rodar no DartPad se quiser ver por ai.
Vamos entender o que temos agora:
- Agora nossa lista mondou de tipo, passou a ser uma List<TarefaModel>. Isto é, uma lista do tipo TarefaModel.
- Não precisamos informar o done como false já que ele é definido por padrão como false caso não for informado.
Não mudou muito né ?
Situação com Listas
Acredito que você já se deparou com uma lista de itens e precisou criar um filtro como por exemplo:
Você tem uma lista de comidas e quer mostrar apenas os doces ou os salgados, ou até mesmo todas as comidas que começam com a letra 'a' ou sei lá!
Obvio que existem formas diferentes de se chegar a esse resultado, nós faremos dois.
Primeiro usaremos o for loop para percorrer a lista de tarefas para trazer apenas as tarefas que foram concluídas.
Depois faremos o mesmo, porém com o método where.
Filtrando com o For loop
Veja o código a seguir:
void main() { final tarefas = [ TarefaModel(title: "Criar uma post sobre listas"), TarefaModel(title: "Recomendar que siga o Instagram da Strawti"), TarefaModel(title: "Fale sobre o YouTube"), ]; final tarefasFiltrada = []; for (TarefaModel tarefa in tarefas) { if (tarefa.done) { tarefasFiltrada.add(tarefa); } } print(tarefasFiltrada); } class TarefaModel { final String title; final bool done; TarefaModel({ required this.title, this.done = false, }); }
Acrescentamos o seguinte:
final tarefasFiltrada = []; for (TarefaModel tarefa in tarefas) { if (tarefa.done) { tarefasFiltrada.add(tarefa); } } print(tarefasFiltrada);
Aqui temos uma outra lista, tarefasFiltrada que receberá nossos itens específicos.