ambiguous_ set_ or_ map_ literal_ both
Detalhes sobre o diagnóstico 'ambiguous_set_or_map_literal_both' produzido pelo analisador do Dart.
The literal can't be either a map or a set because it contains at least one literal map entry or a spread operator spreading a 'Map', and at least one element which is neither of these.
Descrição
#
Como literais de mapa e de conjunto usam os mesmos delimitadores ({ e }),
o analisador observa os argumentos de tipo e os elementos para determinar
qual tipo de literal você quis dizer. Quando não há argumentos de tipo, o
analisador usa os tipos dos elementos. Se todos os elementos são entradas
de mapa literais e todos os operadores spread estão espalhando um Map,
então é um Map. Se nenhum dos elementos é uma entrada de mapa literal e
todos os operadores spread estão espalhando um Iterable, então é um
Set. Se nenhuma dessas condições for verdadeira, a situação é ambígua.
O analisador emite este diagnóstico quando pelo menos um elemento é uma
entrada de mapa literal ou um operador spread que espalha um Map, e pelo
menos um elemento não é nenhum desses, tornando impossível para o analisador
determinar se você está escrevendo um literal de mapa ou de conjunto.
Exemplo
#O código a seguir produz este diagnóstico:
union(Map<String, String> a, List<String> b, Map<String, String> c) => {
...a,
...b,
...c,
};
A lista b só pode ser espalhada em um conjunto, e os mapas a e c
só podem ser espalhados em um mapa; o literal não pode ser os dois ao mesmo tempo.
Correções comuns
#Há duas formas comuns de corrigir este problema. A primeira é remover todos os elementos spread de um tipo ou de outro, para que os elementos fiquem consistentes. Nesse caso, isso provavelmente significa remover a lista e decidir o que fazer com o parâmetro que ficou sem uso:
union(Map<String, String> a, List<String> b, Map<String, String> c) => {
...a,
...c,
};
A segunda correção é alterar os elementos de um tipo para elementos consistentes com os outros. Por exemplo, você pode adicionar os elementos da lista como chaves que mapeiam para si mesmas:
union(Map<String, String> a, List<String> b, Map<String, String> c) => {
...a,
for (String s in b) s: s,
...c,
};
Salvo indicação em contrário, a documentação neste site reflete Dart 3.13.7. Relatar um problema.
Encontrou essa página sem tradução ou que precisa de correção? Abra uma issue e nos ajude a manter esse site em PT-BR para ajudar pessoas como você.