Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Não entendi também

Olá,

Conforme a colega Adna falou no tópico passado, eu também não entendi muito bem a parte ali, mais a do for mesmo, porque na sintaxe que aprendi, o for seria +/- assim: for (int i = 1; i < 5; i++), tem um início i = 1, uma condição, i < 5 e um passo, i++ mas no vídeo está: for (Map<String,synamic> linha in listaDeTarefas), como que devo interpretar esse formato?

Att, Alvaro

3 respostas

Olá Alvaro!

Realmente pode ficar bem confuso o entendimento, mas eu vou tentar ser o mais claro possível:

for (Map<String, dynamic> linha in listaDeTarefas);

Para cada linha (ou entrada) dentro de listaDeTarefas, crie uma nova tarefa, etc etc... O detalhe importante é alinha. Do mesmo jeito que dentro de um for nós definimos um inteiro i que só existe dentro do escopo do laço de repetição, linha também só existe dentro do escopo do for. A sacada é que para cada passo na repetição, uma nova linha é criada.

List<Map<String, Dynamic>> listaDeTarefas = [
        { chave: valor }, -----> linha
        { chave: valor }, -----> outra linha
        { chave: valor }, -----> mais uma linha
        { chave: valor }, -----> última linha
]

O que talvez possa confundir, é a tipagem de linha dentro dos parênteses. Mas basta pensar que é a mesma coisa que declarar int i. Deixando claro também que não precisa ser Map<String, Dynamic>. Tudo depende do conteúdo da lista. Como nesse caso a listaDeTarefas é um List do tipo Map<String, Dynamic>, então cada entrada é do tipo Map<String, Dynamic>.

Essa maneira é bem parecida com um forEach, mas no caso do forEach não precisamos tipar a entrada. Escrevendo a mesma coisa que o for acima ficaria assim:

    listaDeTarefas.forEach((entrada) {})

Espero que tenha ficado claro. Qualquer coisa eu tento explicar de outra maneira.

Oi Matheus,

No caso do exemplo, então, Map<String, Dynamic> linha substituiria o int i em um for normal, ou seja, estou iniciando a variável linha do tipo Map<String, Dynamic>? Se for isso, então, na sequência porque é usado linha[_name] ou os demais, devido aos seus índices de busca no Map?

Att, Alvaro

solução!

É que o for do tipo elements in list é usado em várias linguagens. Não é algo específico do Dart. O problema de escrever um loop do tipo:

for(Map<String, Dynamic> linha, condição, callback)

É que a condição ficaria muito complicada de escrever. O for precisa de uma condição de término, se não ela roda para sempre (e obviamente isso é um problema sério de performance). Eu tentei relacionar com o int i = 0 porque é uma variável que é isolada dentro do for mas não é reiniciada a cada ciclo do loop. Como o i é sobrescrito no final de cada ciclo, meio que ficaria redundante.

Tipo, daria pra fazer? Sim, mas é uma complicação muito desnecessária. Aí ficaria melhor fazer algo do tipo:

for (int i = 0; i < list.length; i++) {
    final element;
    element = list[i];
    fazerAlgoComElement(element);
}

Pra evitar de escrever as duas primeiras linhas, foi utilizado o for( element in list). Tornando o loop assim:

for (element in list) {
    fazerAlgoComElement(element);
}

É que é difícil mostrar todas as possibilidades e casos de uso do for.