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); }| Java | Dart |
|---|---|
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 = ...; | No | No | Al ejecutar (ej. DateTime.now()) |
const x = ...; | No | No | Al 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 → A | Cómo | Ejemplo |
|---|---|---|
| String → int | int.parse(s) | int.parse('123') → 123 |
| String → double | double.parse(s) | double.parse('3.14') |
| String → int (seguro) | int.tryParse(s) | int.tryParse('hola') → null |
| int/double → String | x.toString() | 42.toString() → '42' |
| double → int | x.toInt() | 9.8.toInt() → 9 (corta) |
| double → int redondeado | x.round() | 9.8.round() → 10 |
| int → double | x.toDouble() | 5.toDouble() → 5.0 |
| double → String con decimales | x.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
| Tipo | Operadores | Notas |
|---|---|---|
| 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 |
| Ternario | cond ? a : b | se separa con :, no con , |
| Null | ?? ??= ?. ! | ver sección Null safety |
| Tipos | is is! as | if (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';| Operador | Se lee como | Ejemplo |
|---|---|---|
? en el tipo | puede ser null | int? x; |
?? | si es null, usa esto | x ?? 0 |
??= | asigna si es null | x ??= 0; |
?. | accede si no es null | lista?.add(1) |
! | fuerza no-null | x! |
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 = ''}) { }| Sintaxis | Tipo de parámetro | Al llamar |
|---|---|---|
f(int a) | posicional obligatorio | f(5) |
f([int a = 0]) | posicional opcional | f() o f(5) |
f({int a = 0}) | con nombre opcional | f() o f(a: 5) |
f({required int a}) | con nombre obligatorio | f(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'), ...)| Kotlin | Dart |
|---|---|
(Int, Int) -> Int | int Function(int, int) |
{ x, y -> x + y } | (x, y) => x + y |
fun f() = 5 | int 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étodo | Qué hace | Devuelve |
|---|---|---|
map(f) | transforma cada elemento | Iterable → .toList() / .toSet() |
where(cond) | filtra | Iterable → .toList() |
forEach(f) | recorre, no devuelve nada | void |
any(cond) | ¿alguno cumple? | bool |
every(cond) | ¿todos cumplen? | bool |
reduce((a, b) => a + b) | combina todos en uno | un valor |
fold(0, (acc, n) => acc + n) | como reduce, con valor inicial | un 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
}
}| Constructor | Para 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 Animal19Clases 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
}| Palabra | Significa | Cuántas | Hereda código |
|---|---|---|---|
extends | es un (herencia) | solo 1 | Sí |
implements | cumple el contrato | varias | No: implementas todo tú |
with | añade capacidades (mixin) | varias | Sí |
💡
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();| Concepto | Qué es |
|---|---|
Future<T> | promesa de un valor futuro |
async | marca la función como asíncrona (devuelve un Future) |
await | espera 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
}| Future | Stream | |
|---|---|---|
| Valores | uno | muchos |
| Esperar | await future | await for (var x in stream) / listen() |
| Ejemplo | descargar un usuario | temporizador, 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 errorExtra
24Errores típicos (los que hemos tenido)
| Mal | Bien | Por 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 @override | void ferSoroll() | si el nombre no coincide, no sobrescribe |
dos void main() | un main + funciones | definición duplicada |
import 'dart:mirrors'; en DartPad | quitarlo | no 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
| Kotlin | Dart |
|---|---|
val x = 5 | final x = 5; |
var x = 5 | var x = 5; |
const val PI = 3.14 | const pi = 3.14; |
var s: String? = null | String? s; |
s ?: "def" | s ?? 'def' |
s?.length | s?.length |
s!! | s! |
"Hola $nom ${a + b}" | 'Hola $nom ${a + b}' |
fun suma(a: Int, b: Int): Int = a + b | int 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 X | abstract class X |
data class | clase + toJson/fromJson/toString |
suspend fun / coroutines | Future + async/await |
Flow<T> | Stream<T> |
{ x -> x * 2 } | (x) => x * 2 |
26Atajos de VS Code
| Acción | Windows / Linux | Mac |
|---|---|---|
Comentar / descomentar líneas (//) | Ctrl + / (teclado español: Ctrl + Shift + 7) | Cmd + / |
Comentar en bloque (/* */) | Shift + Alt + A | Shift + Option + A |
| Comentar (siempre funciona) | Ctrl + K, Ctrl + C | Cmd + K, Cmd + C |
| Descomentar | Ctrl + K, Ctrl + U | Cmd + K, Cmd + U |
| Formatear el código | Shift + Alt + F | Shift + Option + F |
| Ejecutar fichero Dart | dart run fichero.dart | igual |
No hay resultados para esa búsqueda.