Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
3
respostas

Erro no .map

Alguém pode me ajudar, estava na aula "Estruturando com Listas de Navegação" e estava fazendo o código como a instrutora explicou, mas o meu VScode está me apontando o seguinte erro no código "The argument type 'Iterable' can't be assigned to the parameter type 'List'. '"

Alguém pode me ajudar a encontrar o problema, vou deixar meu código aqui embaixo

class ListContents extends StatelessWidget {
  final List<CatalogoItem> secoes = [
    CatalogoItem(
      titulo: 'Widgets de Conteúdo',
      icone: Icons.text_fields,
      descricao: 'Exemplos de widgets básicos como Text, Image, Icon...',
      destino: WidgetsConteudo(),
    ),
    CatalogoItem(
      titulo: 'Widgets de Layout',
      icone: Icons.view_agenda,
      descricao: 'Exemplos de widgets de layout como Padding, Align, Center...',
      destino: WidgetsLayout(),
    ),
  ];

  ListContents({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Widgets de conteúdo')),
      body: Column(
        children: secoes.map(
          (item) => ElevatedButton(
            onPressed: () => Navigator.push(
              context,
              MaterialPageRoute(builder: (_) => item.destino),
            ),
            child: Text(item.titulo),
          ),
        ),
      ),
    );
  }
}
3 respostas
solução!

Olá, Francislaine! Como vai?

Parece que o problema está na maneira como o método .map() está sendo utilizado.

O método .map() retorna um Iterable, mas o Column espera receber uma List<Widget> para o parâmetro children. Para resolver isso, você pode converter o Iterable em uma lista usando o método .toList(). Vou mostrar como você pode ajustar o seu código:

class ListContents extends StatelessWidget {
  final List<CatalogoItem> secoes = [
    CatalogoItem(
      titulo: 'Widgets de Conteúdo',
      icone: Icons.text_fields,
      descricao: 'Exemplos de widgets básicos como Text, Image, Icon...',
      destino: WidgetsConteudo(),
    ),
    CatalogoItem(
      titulo: 'Widgets de Layout',
      icone: Icons.view_agenda,
      descricao: 'Exemplos de widgets de layout como Padding, Align, Center...',
      destino: WidgetsLayout(),
    ),
  ];

  ListContents({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Widgets de conteúdo')),
      body: Column(
        children: secoes.map(
          (item) => ElevatedButton(
            onPressed: () => Navigator.push(
              context,
              MaterialPageRoute(builder: (_) => item.destino),
            ),
            child: Text(item.titulo),
          ),
        ).toList(), // Converte o Iterable para uma List
      ),
    );
  }
}

Com essa modificação, você deve conseguir compilar o código sem erros.

Espero ter ajudado e fico à disposição se precisar.

Abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Obrigada Daniel, acho que era isso mesmo que faltava, coloquei o .toList() e funcionou

Boa tarde, Francislaine! Tudo bem?

Que ótimo saber que funcionou depois de adicionar o .toList().

Esse detalhe realmente faz diferença quando estamos lidando com coleções ou streams, porque garante que o resultado seja convertido em uma lista concreta, permitindo manipulações mais diretas e evitando comportamentos inesperados.

Forte abraço!