Colecciones 
List 
Las listas son colecciones ordenadas de elementos. En Dart, las listas se representan con la palabra clave List.
final nums = [1, 2, 3];
List<int> nums = [1, 2, 3];final nums = [1, 2, 3];
List<int> nums = [1, 2, 3];Es importante saber que la lista empieza en el índice 0 no el 1.
void main() {
  final names = ["foo", "bar", "baz"];
  print(list[0]); // foo
  print(list[1]); // bar
  print(list[2]); // baz
}void main() {
  final names = ["foo", "bar", "baz"];
  print(list[0]); // foo
  print(list[1]); // bar
  print(list[2]); // baz
}Las listas son objetos, por lo que tienen propiedades y métodos.
void main() {
  final names = ["foo", "bar", "baz"];
  print(names.length); // 3
  print(names.isEmpty); // false
  print(names.isNotEmpty); // true
  print(names.first); // foo
  print(names.last); // baz
  print(names.reversed); // (baz, bar, foo)
  print(names.reversed.toList()); // [baz, bar, foo]
}void main() {
  final names = ["foo", "bar", "baz"];
  print(names.length); // 3
  print(names.isEmpty); // false
  print(names.isNotEmpty); // true
  print(names.first); // foo
  print(names.last); // baz
  print(names.reversed); // (baz, bar, foo)
  print(names.reversed.toList()); // [baz, bar, foo]
}Set 
Los conjuntos son colecciones de elementos únicos, por lo que no pueden contener elementos duplicados no están ordenados. En Dart, los conjuntos se representan con la palabra clave Set.
var nums = {1, 2, 3};
const names = {'foo', 'bar', 'baz', 'foo'}; // error: foo is duplicated
Set<int> set = {1, 2, 3};var nums = {1, 2, 3};
const names = {'foo', 'bar', 'baz', 'foo'}; // error: foo is duplicated
Set<int> set = {1, 2, 3};Los conjuntos no tienen índices, por lo que no se puede acceder a un elemento por su índice.
void main() {
  final names = {'foo', 'bar', 'baz'};
  print(names[0]); // error: The operator '[]' isn't defined for the class 'Set<String>'
  print(names.first); // foo
  print(names.last); // baz
}void main() {
  final names = {'foo', 'bar', 'baz'};
  print(names[0]); // error: The operator '[]' isn't defined for the class 'Set<String>'
  print(names.first); // foo
  print(names.last); // baz
}Podemos añadir y eliminar elementos de un conjunto.
void main() {
  var names = {'foo', 'bar', 'baz'};
  names.add('qux');
  names.add('foo'); // no effect
  print(names); // {foo, bar, baz, qux}
  names.remove('bar');
  print(names); // {foo, baz, qux}
}void main() {
  var names = {'foo', 'bar', 'baz'};
  names.add('qux');
  names.add('foo'); // no effect
  print(names); // {foo, bar, baz, qux}
  names.remove('bar');
  print(names); // {foo, baz, qux}
}También podemos hacer operaciones de conjuntos como unión, intersección y diferencia.
void main() {
  var a = {1, 2, 3};
  var b = {3, 4, 5};
  print(a.union(b)); // {1, 2, 3, 4, 5}
  print(a.intersection(b)); // {3}
  print(a.difference(b)); // {1, 2}
}void main() {
  var a = {1, 2, 3};
  var b = {3, 4, 5};
  print(a.union(b)); // {1, 2, 3, 4, 5}
  print(a.intersection(b)); // {3}
  print(a.difference(b)); // {1, 2}
}Map 
Los mapas son colecciones de pares clave-valor. En Dart, los mapas se representan con la palabra clave Map. Se puede reescibir un valor de una clave, pero no se puede duplicar una clave.
var map = {1: 'one', 2: 'two', 3: 'three'};
Map<int, String> map = {1: 'one', 2: 'two', 3: 'three'};
Map<String, Object> user = {'name': 'Bob', 'age': 42};
print(user['name']); // Bob
print(user['age']); // 42
user['name'] = 'Alice';
print(user['name']); // Alicevar map = {1: 'one', 2: 'two', 3: 'three'};
Map<int, String> map = {1: 'one', 2: 'two', 3: 'three'};
Map<String, Object> user = {'name': 'Bob', 'age': 42};
print(user['name']); // Bob
print(user['age']); // 42
user['name'] = 'Alice';
print(user['name']); // Alice