Chuleta de Dart

Todo lo que hemos visto antes de empezar con Flutter: sintaxis básica, colecciones, POO y asincronía, con los errores típicos que nos han salido en los ejercicios.

26 seccionesBásicosColeccionesPOOFuture & StreamKotlin ↔ Dart
Básicos

01Estructura de un programa

main.dart
// Comentario de una línea
/* Comentario
   de varias líneas */

import 'dart:async';   // StreamController, Timer...  (solo si lo usas)

void main() {
  print('Hola Mundo');   // imprime y salta de línea
}

// main con argumentos (opcional):
// void main(List<String> args) { print(args); }
JavaDart
public class Main { ... }No hace falta clase: main() va suelta
public static void main(String[] args)void main()
System.out.println("x")print('x')
private int x;int _x; (privado = empieza por _)
new Persona()Persona() (el new es opcional y no se usa)
Entrada/salida por consola
import 'dart:io';   // NO funciona en DartPad (solo con `dart run`)

stdout.write('Sin salto ');           // imprime sin salto de línea
String? texto = stdin.readLineSync(); // leer del teclado
💡
Un fichero = un solo main. Si tienes varios ejercicios, mete cada uno en una función (exercici1(), exercici2()...) y llámalas desde main. Ejecutar: dart run main.dart o pegar en dartpad.dev.
⚠️
dart:io, dart:ffi y dart:mirrors no funcionan en DartPad (se ejecuta en el navegador). Si VS Code te añade imports que no usas, bórralos.

02Variables y tipos

dart
int edad = 22;
double nota = 9.5;
String nombre = 'Marouan';
bool esEstudiante = true;

var ciudad = 'Barcelona';   // tipo inferido -> String (ya no puede cambiar de tipo)
dynamic dato = 'Hola';      // sin control de tipos: puede cambiar
dato = 42;                  // OK con dynamic, ERROR con var

final ahora = DateTime.now();  // se asigna una vez, valor calculado al EJECUTAR
const pi = 3.1416;             // constante fija al COMPILAR

print(edad.runtimeType);       // int
print('${nota.runtimeType}');  // double
Palabra¿Reasignar?¿Cambiar de tipo?Cuándo se conoce
int x = 1;SíNo—
var x = 1;SíNo (queda fijado al primero)—
dynamic x = 1;SíSí—
final x = ...;NoNoAl ejecutar (ej. DateTime.now())
const x = ...;NoNoAl compilar (valor fijo)
⚠️
const ara = DateTime.now(); da error: la fecha no se sabe hasta ejecutar. Usa final.
💡
Estilo Dart: variables y constantes en camelCase (pi, notaFinal), clases en PascalCase (Persona).

03Strings

dart
String nom = 'Pau';
int edat = 20;

print('Hola $nom');                    // variable sola: $
print('El año que viene: ${edat + 1}'); // expresión: ${ }
print('Tipo: ${nom.runtimeType}');      // propiedad: ${ }
print('Hola ' + nom);                   // concatenar (menos usado)

print('Línea 1\nLínea 2');   // \n = salto de línea
print('');                   // línea en blanco
print('''
Texto
multilínea
''');

print("Ets major d'edat");    // comilla simple dentro de dobles
print('Ets major d\'edat');   // o escaparla con \'
Métodos útiles
String s = '  Hola Dart  ';
s.length          // 13
s.trim()          // 'Hola Dart'
s.toUpperCase()   // '  HOLA DART  '
s.toLowerCase()
s.contains('Dart')        // true
s.trim().split(' ')       // ['Hola', 'Dart']
s.trim().substring(0, 4)  // 'Hola'
s.isEmpty / s.isNotEmpty
⚠️
'$nota.runtimeType' imprime 9.5.runtimeType como texto. Todo lo que no sea una variable sola va dentro de ${ }.
⚠️
No mezcles comillas: "Profe' no cierra el string. Abre y cierra con la misma.

04Conversiones de tipo

De → ACómoEjemplo
String → intint.parse(s)int.parse('123') → 123
String → doubledouble.parse(s)double.parse('3.14')
String → int (seguro)int.tryParse(s)int.tryParse('hola') → null
int/double → Stringx.toString()42.toString() → '42'
double → intx.toInt()9.8.toInt() → 9 (corta)
double → int redondeadox.round()9.8.round() → 10
int → doublex.toDouble()5.toDouble() → 5.0
double → String con decimalesx.toStringAsFixed(2)3.14159 → '3.14'
dart
String numText = '123';
int num = int.parse(numText);
print(num + 7);                       // 130

int seguro = int.tryParse('abc') ?? 0; // si falla, 0
⚠️
int.parse('hola') lanza un error y para el programa. Si el texto puede no ser un número, usa tryParse + ??.

05Operadores

TipoOperadoresNotas
Aritméticos+ - * / ~/ %/ siempre da double; ~/ división entera; % resto
Asignación= += -= *= ++ --suma += n es suma = suma + n
Comparación== != > < >= <=!= va junto, nunca ! =
Lógicos&& || !Y, O, NO
Ternariocond ? a : bse separa con :, no con ,
Null?? ??= ?. !ver sección Null safety
Tiposis is! asif (x is String) / x as int
dart
bool a = true, b = false;
print('a && b -> ${a && b}');  // false (las dos deben ser true)
print('a || b -> ${a || b}');  // true  (basta una)
print('!a -> ${!a}');          // false (invierte)

print(7 / 2);   // 3.5
print(7 ~/ 2);  // 3
print(7 % 2);   // 1

String rol = esEstudiante ? 'Estudiante' : 'Profe';
print('Es ${esEstudiante ? "Estudiante" : "Profe"}');  // dentro de texto: ${ }

06Null safety

dart
String nombre = 'Pau';   // NUNCA puede ser null
String? apodo;           // el ? permite null -> empieza valiendo null
print(apodo);            // null

// ??  -> valor por defecto si es null
print('Bienvenido, ${apodo ?? 'Invitado'}');

// ??= -> asigna SOLO si es null
int? puntuacion;
puntuacion ??= 100;   // 100
puntuacion ??= 50;    // sigue 100 (ya no era null)

// ?.  -> llama solo si no es null (si es null, devuelve null y no peta)
print(apodo?.length);   // null

// !   -> "te prometo que no es null" (si lo es, error en ejecución)
String seguro = apodo!;   // ⚠️ peta si apodo es null

// late -> no nullable, pero se inicializa más tarde
late String idUsuario;
idUsuario = 'U-01';
OperadorSe lee comoEjemplo
? en el tipopuede ser nullint? x;
??si es null, usa estox ?? 0
??=asigna si es nullx ??= 0;
?.accede si no es nulllista?.add(1)
!fuerza no-nullx!
Control de flujo

07Condicionales

dart
int temperatura = 18;

if (temperatura < 15) {
  print('Hace frío');
} else if (temperatura <= 25) {
  print('Templado');
} else {
  print('Hace calor');
}
switch clásico (como Java)
String dia = 'dissabte';

switch (dia) {
  case 'dissabte':
  case 'diumenge':          // varios case seguidos = mismo bloque
    print('Fin de semana');
    break;
  default:
    print('Laborable');
}
switch moderno (Dart 3)
switch (dia) {
  case 'dissabte' || 'diumenge':   // agrupar con ||
    print('Fin de semana');        // el break ya no es obligatorio
  default:
    print('Laborable');
}

// switch como EXPRESIÓN (devuelve un valor)
String tipo = switch (dia) {
  'dissabte' || 'diumenge' => 'Fin de semana',
  _ => 'Laborable',               // _ = cualquier otro caso
};
Ternario: if/else en una línea
print(edat >= 18 ? 'Mayor de edad' : 'Menor de edad');

08Bucles

dart
// for clásico
for (int i = 0; i < 5; i++) { print(i); }      // 0..4
for (int i = 10; i >= 1; i--) { print(i); }    // 10..1

// for-in: recorre elementos (como for-each de Java)
List<int> numeros = [2, 4, 6, 8, 10];
int suma = 0;
for (int n in numeros) { suma += n; }           // 30

// for con índice: numeros[i] es el VALOR, i es la POSICIÓN
for (int i = 0; i < numeros.length; i++) { suma += numeros[i]; }

// forEach con función flecha
numeros.forEach((n) => print(n));

// while: comprueba ANTES
var x = 1;
while (x <= 5) { print(x); x++; }   // sin x++ -> bucle infinito

// do-while: se ejecuta AL MENOS una vez, comprueba DESPUÉS
String pass;
do {
  pass = leerIntento();
} while (pass != '1234');   // termina con ; y SIN llaves detrás

// break / continue
for (int i = 0; i < 10; i++) {
  if (i == 3) continue;   // salta esta vuelta
  if (i == 6) break;      // sale del bucle
  print(i);
}
⚠️
Errores típicos: condición al revés (i >= lista.length → el bucle no entra nunca), sumar i en vez de lista[i], olvidar x++ en un while, y poner { } después del while(...) de un do-while.
Funciones

09Funciones

dart
// Básica (las funciones van FUERA de main)
void saludar() {
  print('Hola!');
}

// Con retorno
int suma(int a, int b) {
  return a + b;
}

// Flecha => (una sola expresión)
int quadrat(int x) => x * x;

// Parámetro posicional OPCIONAL [ ] con valor por defecto
void mostrar(String texto, [String prefix = '>>']) {
  print('$prefix $texto');
}
mostrar('Hola');          // >> Hola
mostrar('Hola', '**');    // ** Hola

// Parámetros CON NOMBRE { } (estilo Flutter)
void presentar(String nom, {int edat = 0, String ciutat = 'Desconocida'}) {
  print('$nom, $edat años, $ciutat');
}
presentar('Pau');
presentar('Joan', ciutat: 'Olesa', edat: 30);   // cualquier orden

// required: con nombre pero OBLIGATORIO
void crear({required String id, String titulo = ''}) { }
SintaxisTipo de parámetroAl llamar
f(int a)posicional obligatoriof(5)
f([int a = 0])posicional opcionalf() o f(5)
f({int a = 0})con nombre opcionalf() o f(a: 5)
f({required int a})con nombre obligatoriof(a: 5)

10Funciones anónimas y como parámetro

dart
// Una función que RECIBE otra función
int operar(int a, int b, int Function(int, int) func) {
  return func(a, b);
}

// Pasar una función con nombre (SIN paréntesis)
int sumar(int x, int y) => x + y;
operar(10, 5, sumar);                 // 15

// Pasar funciones anónimas (sin nombre)
operar(10, 5, (x, y) => x - y);       // 5
operar(10, 5, (x, y) {                // con llaves
  return x * y;
});                                   // 50

// En Flutter lo verás todo el rato:
// ElevatedButton(onPressed: () => print('Pulsado'), ...)
KotlinDart
(Int, Int) -> Intint Function(int, int)
{ x, y -> x + y }(x, y) => x + y
fun f() = 5int f() => 5;
Colecciones

11List (listas)

dart
List<String> noms = ['Pau', 'Anna', 'Joan'];

noms.add('Marta');           // añade al final
noms.insert(1, 'Nil');       // inserta en posición 1
noms[0] = 'Pere';            // modifica posición 0
noms.remove('Joan');         // elimina por valor
noms.removeAt(0);            // elimina por posición
noms.addAll(['Laia', 'Marc']); // fusiona otra lista

noms.length       noms.isEmpty      noms.isNotEmpty
noms.first        noms.last         noms.contains('Anna')
noms.indexOf('Anna')               noms.sort()
noms.reversed.toList()

var todas = [...lista1, ...lista2];  // spread: une listas

for (String n in noms) { print(n); }
noms.forEach((n) => print('Hola, $n!'));
Lista sin inicializar
List<String> a;           // ❌ usarla da error de compilación (sin valor)
List<String>? b;          // vale null
b.add('x');               // ❌ error: puede ser null
b?.add('x');              // no peta, pero NO añade nada (sigue null)
List<String> c = [];      // ✅ correcto: lista vacía
c.add('x');

12Set (conjuntos)

dart
Set<String> asig = {'Android', 'Interfícies', 'BBDD'};

bool ok = asig.add('Android');   // false: ya existe -> se ignora
asig.add('Accés a dades');
asig.remove('BBDD');
asig.contains('Android');        // true
asig.length

for (String a in asig) { print(a); }
asig.forEach((a) => print(a));

Set<int> sinRepetidos = [1, 1, 2, 3].toSet();   // {1, 2, 3}
💡
Set = sin repetidos y sin posiciones (no existe asig[0]). Ojo: {} vacío sin tipo es un Map; para un Set vacío escribe <String>{}.

13Map (diccionarios)

dart
Map<String, double> notes = {
  'Pau': 7.5,
  'Anna': 4.0,
};

notes['Laia'] = 6.8;     // clave nueva -> añade
notes['Anna'] = 5.5;     // clave existente -> modifica
notes.remove('Pau');     // elimina por clave
notes['Xavi'];           // null (no existe)
notes.containsKey('Anna');
notes.keys     notes.values     notes.entries     notes.length

// Recorrer claves
for (String nom in notes.keys) {
  print('$nom -> ${notes[nom]}');
}

// Recorrer clave-valor
notes.forEach((nom, nota) => print('$nom: $nota'));

for (var e in notes.entries) {
  print('${e.key} = ${e.value}');
}

// Valores de distintos tipos (típico de JSON)
Map<String, dynamic> alumne = {
  'nom': 'Marouan',
  'edat': 22,
  'repetidor': false,
  'asignaturas': ['Android', 'Interfícies'],
};

14map(), where() y compañía

dart
List<int> nums = [1, 2, 3, 4, 5];

// map: transforma CADA elemento
var triple = nums.map((n) => n * 3).toList();        // [3, 6, 9, 12, 15]

// where: FILTRA (se queda con los que cumplen)
var pares = nums.where((n) => n % 2 == 0).toList();  // [2, 4]

// Set con map -> .toSet()
var min = {'DART', 'KoTLiN'}.map((p) => p.toLowerCase()).toSet();

// Map.map -> devuelve MapEntry(clave, valor)
Map<String, String> estados = notes.map(
  (nom, nota) => MapEntry(nom, nota >= 5 ? 'Aprobado' : 'Suspenso'),
);

// Filtrar un Map
var altas = Map.fromEntries(notes.entries.where((e) => e.value >= 8));

// Encadenar
var aprobados = notes.entries
    .where((e) => e.value >= 5)
    .map((e) => e.key.toUpperCase())
    .toList();
MétodoQué haceDevuelve
map(f)transforma cada elementoIterable → .toList() / .toSet()
where(cond)filtraIterable → .toList()
forEach(f)recorre, no devuelve nadavoid
any(cond)¿alguno cumple?bool
every(cond)¿todos cumplen?bool
reduce((a, b) => a + b)combina todos en unoun valor
fold(0, (acc, n) => acc + n)como reduce, con valor inicialun valor
⚠️
map() y where() devuelven un Iterable, no una List. Si lo guardas en List<int> sin .toList(), da error.
POO

15Clases y constructores

dart
class Persona {
  String nom;
  int edat;

  // 1) Constructor corto con this.
  Persona(this.nom, this.edat);

  // 2) Constructor con lista de inicialización (va después de los :)
  // Persona(String n, int e) : nom = n, edat = e;

  // 3) Constructor CON NOMBRE (Dart no tiene sobrecarga)
  Persona.buit() : nom = 'Sin nombre', edat = 0;

  // toString: lo que sale al hacer print(objeto)
  @override
  String toString() => 'Persona(nombre: $nom, edad: $edat)';
}

var p1 = Persona('Anna', 25);   // sin new
var p2 = Persona.buit();
print(p1);                      // Persona(nombre: Anna, edad: 25)
late final + constructor con cuerpo
class Alumne {
  String nom;
  late final String idAlumne;     // se asigna UNA vez, más tarde

  Alumne(this.nom, String id) {
    idAlumne = id;                // se asigna en el cuerpo { }
  }

  Alumne.fromMap(Map<String, dynamic> map)
      : nom = map['nom'] ?? 'Desconocido' {   // initializer list
    idAlumne = map['id'] ?? 'SIN-ID';         // cuerpo
  }
}
Parámetro con el mismo nombre que el atributo
class Sensor {
  late final String id;
  String tipus;

  // [ ] = parámetro opcional con valor por defecto
  Sensor(String id, [this.tipus = 'genérico']) {
    this.id = id;   // this.id = atributo, id = parámetro
  }
}
ConstructorPara qué
Clase(this.a, this.b);el normal, asigna directo
Clase(int x) : a = x;initializer list: asigna antes del cuerpo
Clase.nombre() : ...;otra forma de crear (buit, origen, fromMap)
Clase({required this.a});con nombre, estilo Flutter

16Privado, getters y setters

dart
class CompteBancari {
  double _saldo = 0;            // privado: empieza por _

  // getter: se usa SIN paréntesis -> compte.saldo
  double get saldo => _saldo;

  // setter con validación -> compte.saldo = 100;
  set saldo(double valor) {
    if (valor >= 0) {
      _saldo = valor;
    } else {
      print('Error: el saldo no puede ser negativo');
    }
  }

  void ingresar(double cantidad) {
    if (cantidad <= 0) return;
    saldo = saldo + cantidad;   // pasa por el setter
  }
}

class Rectangle {
  double ancho, alto;
  Rectangle(this.ancho, this.alto);
  double get area => ancho * alto;   // getter calculado
}

compte.saldo = 150;     // llama al setter
compte.saldo = -50;     // setter -> mensaje de error, no cambia
print(compte.saldo);    // llama al getter -> 150.0
print(pista.area);      // getter, SIN ()
💡
En Dart _ es privado del fichero, no de la clase. Desde el mismo fichero podrías tocar _saldo, pero usa siempre el getter/setter.

17Herencia

dart
class Animal {
  String nom;
  Animal(this.nom);

  void ferSoroll() {
    print('$nom hace un ruido genérico');
  }
}

class Gos extends Animal {
  Gos(String nom) : super(nom);   // llama al constructor del padre
  // Dart 3 (equivalente): Gos(super.nom);

  @override
  void ferSoroll() {              // sobrescribe el del padre
    print('$nom dice: ¡Guau!');
  }
}
⚠️
Si escribes mal el nombre del método (ferSorrll), NO sobrescribe nada: se ejecuta el del padre. El @override te avisa con un warning: léelo.

18Mixins

dart
// Mixin = bloque de métodos que "pegas" a una clase con with
mixin Caminador {
  void caminar() => print('Caminando...');
}
mixin Saltador {
  void saltar() => print('¡Saltando!');
}

class Robot with Caminador, Saltador {   // no hereda de nadie
  void presentar() => print('Soy un robot');
}

// Mixin CON restricción: solo para hijos de Animal
mixin Domesticable on Animal {
  void menjar() => print('$nom está comiendo');  // puede usar nom
}

class Gat extends Animal with Domesticable {
  Gat(String nom) : super(nom);
}

// class Roca with Domesticable {}   // ❌ ERROR: Roca no es un Animal

19Clases abstractas e interfaces

dart
// Dart no tiene la palabra 'interface' de Java:
// se usa una clase abstracta + implements
abstract class Enviable {
  void enviar();          // método sin cuerpo
}

class Email implements Enviable {
  String destinatari;
  Email(this.destinatari);

  @override
  void enviar() => print('Enviando EMAIL a $destinatari');
}

class Whatsapp implements Enviable {
  String telefon;
  Whatsapp(this.telefon);

  @override
  void enviar() => print('Enviando WHATSAPP al $telefon');
}

// Implementar VARIAS
class Document implements Printable, Guardable { ... }

// Polimorfismo: una lista del tipo padre con hijos distintos
List<Enviable> mensajes = [Email('a@b.com'), Whatsapp('600 111 222')];
for (Enviable m in mensajes) {
  m.enviar();   // cada uno ejecuta SU versión
}
PalabraSignificaCuántasHereda código
extendses un (herencia)solo 1Sí
implementscumple el contratovariasNo: implementas todo tú
withañade capacidades (mixin)variasSí
💡
Orden si los combinas: class Gat extends Animal with Domesticable implements Guardable { }

20Modelos estilo Flutter (JSON)

dart
class Task {
  String id;
  String titol;
  bool completada;

  // Constructor con nombre: Task(id: 'T-01', titol: '...')
  Task({
    required this.id,
    required this.titol,
    this.completada = false,
  });

  // Map/JSON -> Objeto
  Task.fromJson(Map<String, dynamic> json)
      : id = json['id'] ?? '',
        titol = json['titol'] ?? '',
        completada = json['completada'] ?? false;

  // Objeto -> Map/JSON
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'titol': titol,
      'completada': completada,
    };
  }

  void canviarEstat() => completada = !completada;

  @override
  String toString() => 'Task($id, $titol, $completada)';
}

Task t1 = Task(id: 'T-01', titol: 'Aprobar el teórico');
Map<String, dynamic> json = t1.toJson();
Task t2 = Task.fromJson(json);
Truco: números que pueden venir como int
// Si el JSON trae 10 en vez de 10.0, Dart lo lee como int
// y asignarlo a un double peta. Solución:
preu = (map['preu'] ?? 0).toDouble();
💡
Este patrón (fromJson / toJson) es el que usarás para leer de Firebase o de una API en Flutter.
Asincronía

21Future, async y await

dart
// Future<T> = UN valor que llegará más tarde
Future<String> obtenirUsuari() async {
  await Future.delayed(Duration(seconds: 2));   // simula el servidor
  return 'Datos del usuario descargados';
}

void main() async {                  // async para poder usar await
  print('Inicio descarga...');
  String res = await obtenirUsuari();  // espera aquí 2 s
  print(res);
  print('Final');
}

// Funciones async que no devuelven nada:
Future<void> exercici1() async { ... }
// y en main:  await exercici1();
ConceptoQué es
Future<T>promesa de un valor futuro
asyncmarca la función como asíncrona (devuelve un Future)
awaitespera al Future antes de seguir (solo dentro de async)
Future.delayed(Duration(...))espera X tiempo
Duration(seconds: 2, milliseconds: 500)una duración
⚠️
Sin await no tienes el valor sino el Future: print(obtenirUsuari()) imprime Instance of 'Future<String>'.

22Streams

dart
// Stream<T> = VARIOS valores a lo largo del tiempo
Stream<int> temporitzador() {
  return Stream.periodic(
    Duration(milliseconds: 500),   // uno cada medio segundo
    (i) => i,                      // 0, 1, 2, 3...
  ).take(5);                       // solo 5 y se cierra
}

// await for: recibe cada valor, sale cuando el Stream se cierra
await for (var valor in temporitzador()) {
  print('Valor recibido: $valor');
}
print('Temporizador finalizado');
StreamController: emitir y escuchar a mano
import 'dart:async';

StreamController<String> controller = StreamController<String>();

// 1) Primero el oyente
controller.stream.listen(
  (msg) => print('Notificación: $msg'),     // onData
  onError: (e) => print('Error recibido: $e'),
  onDone: () => print('Canal cerrado'),
);

// 2) Luego emites
controller.add('Usuario conectado');
await Future.delayed(Duration(milliseconds: 500));
controller.addError('ERROR 501');   // el oyente sigue escuchando
await controller.close();           // -> onDone

// 3) Añadir después de cerrar lanza excepción
try {
  controller.add('Después de cerrar');
} catch (e) {
  print('No se puede: $e');   // Bad state: Cannot add new events after calling close
}
FutureStream
Valoresunomuchos
Esperarawait futureawait for (var x in stream) / listen()
Ejemplodescargar un usuariotemporizador, chat, sensor, Firestore en tiempo real

23try / catch

dart
try {
  int n = int.parse('hola');
} on FormatException catch (e) {   // captura un tipo concreto
  print('No es un número: $e');
} catch (e) {                      // cualquier otro error
  print('Error: $e');
} finally {
  print('Esto se ejecuta siempre');
}

throw Exception('Algo ha ido mal');   // lanzar un error
Extra

24Errores típicos (los que hemos tenido)

MalBienPor qué
'... ${x ? "A" : "B'}''... ${x ? "A" : "B"}'comillas mezcladas: no cierra
'$x ? "A", "B"''${x ? "A" : "B"}'falta ${ } y se separa con :
'$nota.runtimeType''${nota.runtimeType}'sin llaves solo coge la variable
while (p ! = '1234')while (p != '1234')!= va junto
} while (c) { ... }} while (c);el do-while acaba en ;
for (i = 0; i >= l.length - 1; i++)for (i = 0; i < l.length; i++)condición al revés: no entra
suma += i;suma += numeros[i];i es la posición, no el valor
required this.titol (sin coma)required this.titol,separar parámetros con coma
Ma<String, dynamic>Map<String, dynamic>errata en el tipo
void ferSorrll() con @overridevoid ferSoroll()si el nombre no coincide, no sobrescribe
dos void main()un main + funcionesdefinición duplicada
import 'dart:mirrors'; en DartPadquitarlono existe en el navegador
const t = DateTime.now();final t = DateTime.now();const debe ser fijo al compilar
List<int> l = lista.map(...);lista.map(...).toList()map devuelve Iterable

25Kotlin ↔ Dart

KotlinDart
val x = 5final x = 5;
var x = 5var x = 5;
const val PI = 3.14const pi = 3.14;
var s: String? = nullString? s;
s ?: "def"s ?? 'def'
s?.lengths?.length
s!!s!
"Hola $nom ${a + b}"'Hola $nom ${a + b}'
fun suma(a: Int, b: Int): Int = a + bint suma(int a, int b) => a + b;
listOf(1, 2) / mutableListOf()[1, 2]
setOf() / mapOf("a" to 1){1, 2} / {'a': 1}
when (x) { ... }switch (x) { ... }
for (i in 0 until 5)for (int i = 0; i < 5; i++)
class Gos(nom: String) : Animal(nom)class Gos extends Animal { Gos(super.nom); }
interface Xabstract class X
data classclase + toJson/fromJson/toString
suspend fun / coroutinesFuture + async/await
Flow<T>Stream<T>
{ x -> x * 2 }(x) => x * 2

26Atajos de VS Code

AcciónWindows / LinuxMac
Comentar / descomentar líneas (//)Ctrl + / (teclado español: Ctrl + Shift + 7)Cmd + /
Comentar en bloque (/* */)Shift + Alt + AShift + Option + A
Comentar (siempre funciona)Ctrl + K, Ctrl + CCmd + K, Cmd + C
DescomentarCtrl + K, Ctrl + UCmd + K, Cmd + U
Formatear el códigoShift + Alt + FShift + Option + F
Ejecutar fichero Dartdart run fichero.dartigual
No hay resultados para esa búsqueda.