Operadores de propagação do Dart

Operadores de propagação Spread operators ... e ...?

Avalia uma expressão de coleção, desempacota todos os elementos da coleção e os extrai para inserir em outro literal de coleção (lista, Set, Map)

Não são expressões de operadores: ... e ...? não são operadores no sentido tradicional, mas sim açúcar sintático

São divididos em dois tipos

...collection: propagação comum. Exige que a coleção nunca seja null; ao passar null um erro é lançado imediatamente

...?collection: propagação segura para nulos. Se a coleção for null, ela é ignorada sem disparar exceção

Veja os exemplos oficiais para entender com facilidade

void main() {
  final list1 = [1, 2, 3];
  final list2 = [0, ...list1, 4, 5];
  print(list2); // [0, 1, 2, 3, 4, 5]

  // Propagação segura para null
  List<int>? maybeList;
  final safeList = [10, ...?maybeList, 20];
  print(safeList); // [10, 20], nenhum erro se maybeList for null
}Code language: Dart (dart)

No exemplo acima temos duas coleções: a primeira contém os três elementos 1, 2, 3. A segunda insere a primeira coleção após o número 0 e depois adiciona 4 e 5, resultando em [0, 1, 2, 3, 4, 5]

O segundo exemplo também faz inserção, mas como maybeList é null e usamos a propagação segura, nenhum elemento é inserido, o resultado não muda e não ocorre erro

Exemplo com Set

void main() {
	final set1 = {1, 2};
	final set2 = {3, ...set1, 4};
	print(set2); // {3, 1, 2, 4}
}Code language: PHP (php)

Exemplo com Map

void main() {
	final map1 = {'a': 1, 'b': 2};
	final map2 = {'c': 3, ...map1, 'd': 4};
	print(map2); // {c: 3, a: 1, b: 2, d: 4}
}Code language: PHP (php)

Observações

Não é possível usar ... isolado fora de [] e {}

void main() {
    final list1 = [1, 2, 3];
	var arr = ...list; // Erro de sintaxe, só pode ser escrito dentro de um literal de coleção
}Code language: PHP (php)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:3:12: Error: Expected an identifier, but got '...'.
Try inserting an identifier before '...'.
        var arr = ...list; // Erro de sintaxe, só pode ser escrito dentro de um literal de coleção
                  ^^^
bin/firstdart.dart:3:12: Error: Expected ';' after this.
        var arr = ...list; // Erro de sintaxe, só pode ser escrito dentro de um literal de coleção
                  ^^^
bin/firstdart.dart:3:15: Error: Undefined name 'list'.
        var arr = ...list; // Erro de sintaxe, só pode ser escrito dentro de um literal de coleçãoCode language: PHP (php)

Ao usar ... diretamente em um valor null ocorre erro em tempo de execução. Sempre use ...? se a variável puder ser null

void main() {
	List<int>? list = null;
	var res = [...list]; // Causa erro
	var resSafe = [...?list]; // Funciona normalmente
}Code language: PHP (php)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:3:16: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
        var res = [...list]; // Causa erroCode language: PHP (php)

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *