var name = 'Alice';
Variable con tipo inferido
String name = 'Alice';
Variable con tipo explícito
final age = 30;
Constante en tiempo de ejecución (asignación única)
const pi = 3.14;
Constante en tiempo de compilación
late String description;
No-nulable con inicialización diferida
int double num String bool
Tipos integrados
dynamic x = 'anything';
Tipo dinámico (any)
var name = 'World';
print('Hello, $name!'); Interpolación de cadena
print('Sum: ${a + b}'); Interpolar expresión
if (x > 0) { ... } else if (x == 0) { ... } else { ... } If/else
for (var i = 0; i < 10; i++) { ... } Bucle for clásico
for (var item in list) { ... } Bucle for-in
list.forEach((item) => print(item));
Iteración con forEach
while (condition) { ... } Bucle while
switch (x) {
case 1: ...; break;
default: ...;
} Sentencia switch
String? maybeName;
Tipo nullable
name ?? 'Anonymous'
Operador de coalescencia nula
name ??= 'default';
Asignar si es null
user?.name?.length
Cadena con null-aware
name!
Aserción no-nulo (bang)
if (name != null) { print(name.length); } Promoción a no-nulo tras check
var list = [1, 2, 3];
Literal de lista
List<int> list = [1, 2, 3];
Lista tipada
list.add(4);
Añadir elemento
list.removeAt(0);
Eliminar por índice
list.where((x) => x > 2).toList()
Filtrar lista
list.map((x) => x * 2).toList()
Transformar cada elemento
list.reduce((a, b) => a + b)
Reducir a un solo valor
var set = {1, 2, 3}; Literal de set
var map = {'a': 1, 'b': 2}; Literal de map
map['key'] = value;
Establecer valor del map
map.containsKey('key') Comprobar si existe la clave
[...list1, ...list2]
Operador spread
[if (c) 'a', for (var i in list) i]
If/for en colecciones
int add(int a, int b) => a + b;
Función flecha
void greet(String name) {
print('Hello $name');
} Función con nombre
void greet({String name = 'World'}) {} Parámetros nombrados con defaults
void greet({required String name}) {} Parámetro nombrado obligatorio
void log(String msg, [String? tag]) {} Parámetro posicional opcional
var f = (int x) => x * 2;
Función anónima (lambda)
class User {
String name;
int age;
User(this.name, this.age);
} Clase con constructor
User({required this.name, this.age = 0}); Parámetros de constructor nombrados
User.guest() : name = 'Guest', age = 0;
Constructor nombrado
class Admin extends User { ... } Herencia
class Duck with Swimmer, Flyer { ... } Mixins
abstract class Shape { double area(); } Clase abstracta
class Point {
final double x, y;
const Point(this.x, this.y);
} Clase inmutable con const constructor
String get fullName => '$first $last';
Getter
set age(int v) { _age = v; } Setter
static const version = '1.0';
Miembro estático
Future<String> fetch() async {
return 'data';
} Función asíncrona
final data = await fetch();
Await de un Future
try {
await risky();
} catch (e) { ... } Manejo de errores asíncrono
Stream<int> counter() async* {
for (var i = 0; ; i++) yield i;
} Generador async (Stream)
await for (var event in stream) { ... } Escuchar un stream
Future.delayed(Duration(seconds: 1), () => 'done')
Future con delay
Future.wait([f1, f2, f3])
Esperar múltiples futures
Cheat Sheet de Dart — Null Safety, Async/Await, Clases y Mixins
Dart salió en 2011, incorporó null safety estricta en Dart 2.12 y hoy es sobre todo el lenguaje detrás de Flutter. La chuleta de abajo cubre 55+ fragmentos en básicos, null safety, colecciones, funciones, clases y async — el trozo al que se recurre a diario en cliente y servidor. La mayoría de los líos en código Dart no vienen de olvidar sintaxis. Vienen de rarezas que parecen razonables hasta que muerden. El modificador `late` aplaza la inicialización pero lanza un `LateInitializationError` la primera vez que el campo se lee antes de asignarlo, y el fallo aparece lejos de la asignación que falta. El bang `!` afirma "confía, no es null" y lanza un error en el primer acceso, y oculta la causa real. `const` y `final` parecen intercambiables, pero `const` es constante en tiempo de compilación — utilizable en constructores `const` y canonicalizada por el runtime — mientras que `final` es asignación única en runtime. Estos son los fragmentos que se acaban consultando al depurar eso: el operador null-aware adecuado, el constructor que toca, el patrón async correcto, sin releer la guía de Dart desde la primera página cada vez.
Trampas habituales en Dart
Hay un puñado de patrones que merecen sitio cerca de la cabecera de cualquier archivo Dart. `String?` y `String` son tipos distintos bajo null safety estricta, así que un valor `String?` no se asigna donde se espera un `String` sin desempaquetado explícito (`!`, `??` o una comprobación que promueva el tipo). El operador `??=` asigna solo si la variable es null — la forma idiomática de inicializar perezosamente un campo nullable sin un `if`. Los literales `[1, 2, 3]` son growable por defecto, mientras que `List.filled(n, value)` devuelve una lista fija salvo que se pase `growable: true`, y llamar a `add` sobre la fija lanza en runtime y no en compilación. La cascada `..` devuelve el receptor en lugar del resultado del método, así que `final controller = TextEditingController()..addListener(...)` deja el controller en el ámbito y no el registro del listener. Las funciones async envuelven implícitamente su retorno en un `Future`, así que un `return value` síncrono dentro de `async` produce un `Future<T>` y obliga a esperarlo con `await`. La chuleta agrupa esto en Básicos, Null Safety, Colecciones, Funciones, Clases y Async para que la sección esté a un clic.
- Más de 55 fragmentos prácticos de Dart
- 6 categorías del lenguaje
- Operadores y patrones de null safety
- Async/await y Streams
- Clases, mixins y constructores
- Copia al portapapeles con un clic
Gratis. Sin registro. Tus datos permanecen en tu navegador. Anuncios mediante Google AdSense (con consentimiento).
Por Marco B. ·