I. Las tres colecciones nativas de Dart
Dart trae tres tipos de colecciones integradas de forma nativa: List, Set y Map;
La limitación del tipo de elemento dentro de la colección se configura mediantegenéricos (Generics).
| Tipo de colección | Características principales | Identificador literal |
|---|---|---|
| List | Ordenado, permite duplicados, acceso por subíndice | [] |
| Set | Sin orden, elementos únicos, sin subíndices | {} (se debe indicar el genérico explícitamente para que se reconozca como Set) |
| Map | Almacena pares clave-valor, la clave es única, los valores pueden repetirse | {clave: valor} |
II. List Lista (array ordenado)
1. Definición básica e inferencia de tipos
- En Dart, los arrays son objetos
Listpor naturaleza y se crean con el literal[]; - El tipo se infiere automáticamente, por ejemplo:
var list = [1,2,3]→List<int>; si insertas un valor que no sea int se producirá un error; - Admitecoma final al final de la lista, no afecta la sintaxis y reduce errores al copiar y pegar:
var list = ['Car', 'Boat', 'Plane',];
2. Operaciones básicas
- Regla de subíndices: empiezan desde 0, el último subíndice es
list.length - 1; - Lectura / modificación de elementos:
list[index],list[index] = nuevoValor; - Obtener la longitud: propiedad
.length;
Ejemplo
void main() {
var list = [1,2,3];
print(list.length);//Imprime la cantidad de elementos: 3
print(list[1]);// Imprime 2
list[1] = 9; //Modifica el segundo elemento a 9
print(list[1]);//Imprime el valor modificado: 9
}Lenguaje del código: Dart (dart)

3. Lista constante (inmutable en tiempo de compilación)
Antepon la palabra reservada const al literal; no podrás agregar, eliminar ni modificar elementos en tiempo de ejecución:
void main() {
var constantList = const [1,2,3];
constantList[1] = 100; // Error de compilación
}Lenguaje del código: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Unhandled exception:
Unsupported operation: Cannot modify an unmodifiable list
#0 UnmodifiableListMixin.[]= (dart:_internal/list.dart:89:5)
#1 main (file:///D:/dartdemo/firstdart/bin/firstdart.dart:4:14)
#2 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:314:19)
#3 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)Lenguaje del código: PHP (php)
III. Set Conjunto
Elementos sin orden y valores únicos
1. Características principales de Set
- Sin orden: los elementos no tienen un subíndice fijo, no se pueden leer ni modificar mediante
[subíndice] - Elementos únicos: elimina duplicados automáticamente; al agregar elementos repetidos no saldrá error, pero solo se mantendrá una copia
- Identificador literal: llaves
{} - Restricción genérica: se puede limitar el almacenamiento a un único tipo; insertar tipos distintos causará error de compilación o ejecución
Diferenciar Set vacío y Map vacío (punto confuso para principiantes)
El símbolo {} se interpreta como Map por defecto; para crear un Set vacío debes indicar el genérico explícitamente
void main() {
// Set vacío de tipo String
var names = <String>{};
Set<String> names2 = {}; // Escritura equivalente
// Sin anotación genérica, Dart lo reconoce como Map<dynamic, dynamic>
var names3 = {};
}Lenguaje del código: Dart (dart)
Inferencia de tipos
void main() {
// Se infiere automáticamente como Set<String>
var halogens = {'dog', 'cat', 'horse'};
// Se infiere automáticamente como Set<int>
var nums = {1, 2, 6, 2}; // El valor duplicado 2 se elimina, el resultado final es {1,2,6}
// Tipos mezclados, se infiere Set<Object> (no recomendado, pierde la comprobación de tipos)
var mix = {1, "apple"};
}Lenguaje del código: JavaScript (javascript)
Después de la inferencia, si insertas un elemento de otro tipo se generará un error
void main() {
// El literal solo contiene cadenas, se infiere Set<String>
var animals = {'dog'};
print(animals.runtimeType); // _CompactLinkedHashSet<String>
// Agregar cadenas del mismo tipo sin errores
animals.add('cat');
animals.add('pig');
print(animals); // {dog, cat, pig}
// Error: el método add espera un String, pero se pasa un valor int
animals.add(1);
}Lenguaje del código: Dart (dart)

2. Agregar, eliminar y longitud
- Agregar un solo elemento:
.add(); - Agregar varios elementos en lote:
.addAll(); - Obtener el total de elementos:
.length;
var elements = <String>{};
elements.add('fluorine');
elements.addAll({'chlorine', 'bromine'});
print(elements.length); //3Lenguaje del código: PHP (php)
3. Set constante
Antepon const al literal; no se pueden agregar ni borrar elementos:
final constantSet = const {'fluorine', 'chlorine'};
// constantSet.add('helium'); // Genera errorLenguaje del código: PHP (php)
IV. Map Mapa (pares clave-valor)
1. Características básicas
- Almacena datos en pares
Clave-Valor; - La clave es única en todo el mapa, los valores se pueden repetir;
- Tanto la clave como el valor admiten cualquier tipo de objeto;
- Formato literal
{clave: valor}; - Inferencia automática de tipos:
void main() {
var gifts = {'first': 'partridge'}; // Se infiere automáticamente Map<String, String>
var nobleGases = {2: 'helium'}; // Se infiere automáticamente Map<int, String>
}Lenguaje del código: Dart (dart)
2. Dos formas de creación
- Creación mediante literal
var gifts = {'first': 'partridge'}; Lenguaje del código: Dart (dart)
- Creación mediante constructor Map (se puede omitir la palabra
new)
// Escritura con constructor
var gifts = Map<String, String>();
gifts['first'] = 'partridge';Lenguaje del código: JavaScript (javascript)
3. Agregar, consultar y longitud
- Agregar / sobrescribir par clave-valor:
map[clave] = valor; - Obtener valor por clave:
map[clave]; si la clave no existe retornanull; - Obtener el total de pares clave-valor:
.length;
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Agregar nuevo par
print(gifts['first']); // Consultar valor
print(gifts['fifth']);// Consultar clave inexistente
print(gifts.length); // Obtener cantidad de pares Lenguaje del código: PHP (php)
4. Map constante
Antepon const al literal; no se pueden modificar los pares clave-valor:
final constantMap = const {2: 'helium', 10: 'neon'};
// constantMap[2] = 'Helium'; // Genera errorLenguaje del código: Dart (dart)
V. Elementos extendidos en literales de colección
Dentro de los literales de colección se admiten varias sintaxis especiales, divididas en dos grandes grupos: elementos básicos y elementos de control de flujo, para simplificar la construcción de colecciones.
- Elementos básicos: expresiones simples, pares clave-valor, elementos seguros contra null
- Elementos de control de flujo: operador spread, condicional if, bucle for, combinaciones anidadas
1. Elementos de expresión simple
Es la forma más básica: escribe directamente una expresión y su resultado se inserta en la colección. En el siguiente ejemplo el segundo elemento es el resultado de calcular 2 * 3, el resultado final es [1, 6, text]
void main() {
var list = [1, 2 * 3, 'text'];
print(list); //[1, 6, text]
}Lenguaje del código: PHP (php)
2. Elementos clave-valor
Solo para literales Map, formato expresiónClave : expresiónValor. En el ejemplo siguiente tanto la clave como el valor del primer elemento se calculan mediante expresiones.
void main() {
var map = {1+1: 3*8, 'name': 'apple'};
print(map); //{2: 24, name: apple}
}Lenguaje del código: Dart (dart)
3. Elementos seguros contra null (Dart ≥3.8)
Sintaxis ?expresión: solo se inserta en la colección si el resultado de la expresión no es null; si es null se ignora totalmente
Uso en List: a es null así que al final no se inserta, sin errores
int? a = null;
int? b = 3;
var items = [1, ?a, ?b, 5]; // [1, 3, 5]Lenguaje del código: JavaScript (javascript)
Uso en Map (se puede añadir ? tanto a la clave como al valor)
String? k = null;
int? v = null;
var m = {?k: ?v}; // Si la clave o el valor son null, todo el par se elimina
Lenguaje del código: JavaScript (javascript)
4. Operador Spread (despliegue)
① Despliegue normal ...
Despliega todos los elementos de una colección iterable para insertarlos; no se puede desplegar una colección null
var a = [1,2,3];
var items = [0, ...a, 4]; // [0,1,2,3,4]Lenguaje del código: JavaScript (javascript)
② Despliegue seguro contra null ...?
Compatible con colecciones que pueden ser null: si la colección es null se ignora sin errores;
Si la colección no es null pero contiene elementos null internos, dichos null se mantienen
List<int>? a = null;
var b = [1, null, 3];
var items = [0, ...?a, ...?b, 4]; // [0, 1, null, 3, 4]Lenguaje del código: PHP (php)
Norma obligatoria: las colecciones que admiten null deben usar
...?, en caso contrario habrá error de compilación.
5. Elemento If (condicional)
Se puede escribir una rama if directamente dentro de la colección; solo inserta el contenido si se cumple la condición. Admite comprobación booleana, coincidencia de patrones if-case y else
Comprobación booleana básica
void main() {
bool flag = true;
var list = [0, if(flag) 1 else 99, 2];
print(list); //[0, 1, 2]
}Lenguaje del código: Dart (dart)
Coincidencia de patrones if-case (desestructuración de tipos y arrays)
void main() {
Object data = 123;
var info = [
if(data case int i) 'Número: $i',
if(data case String s) 'Texto: $s'
];
print(info); //[Número: 123]
}Lenguaje del código: Dart (dart)
Como data es de tipo int, solo se inserta «Número: 123» y se ignora la rama de texto
6. Elemento For (bucle)
Se puede escribir un bucle for directamente dentro de la colección para generar varios elementos en iteración. Admite for-in y el bucle tradicional de tres partes
var nums = [2,3,4];
// for-in
var list1 = [1, for(var n in nums) n*n, 7]; // [1,4,9,16,7]
// Bucle for de tres partes
var list2 = [1, for(var x=5; x>2; x--) x, 7]; // [1,5,4,3,7]Lenguaje del código: JavaScript (javascript)
7. Control de flujo anidado
if, for y el operador spread se pueden anidar en múltiples niveles libremente, equivalente a las comprensiones de lista de otros lenguajes
Ejemplo: conservar solo números pares
var numbers = [1,2,3,4,5,6];
var items = [
0,
for(var n in numbers)
if(n.isEven) n,
8
]; // [0,2,4,6,8]Lenguaje del código: JavaScript (javascript)
Ejemplo: for anidado + if + operador spread
void main() {
var ys = [1,2,3];
var nest = [
...[
for(var x=0;x<2;x++)
for(var y in ys)
if(x<y) x+y*10
]
];
print(nest); //[10, 20, 30, 21, 31]
}Lenguaje del código: Dart (dart)