Dart: Funciones, Parámetros y Closures
Parámetros nombrados/opcionales, arrow functions y funciones que recuerdan su propio estado
🏷️ 1. Parámetros nombrados y opcionales
Resultado:
Llama a la función
String saludar({String nombre = 'Invitado', int? edad}) {
final edadTexto = edad != null ? ' ($edad años)' : '';
return 'Hola, $nombre$edadTexto!';
}
saludar(); // Hola, Invitado!
saludar(nombre: 'Jorge'); // Hola, Jorge!
saludar(nombre: 'Jorge', edad: 30); // Hola, Jorge (30 años)!
💡 { } vs [ ]
Los parámetros entre { } son nombrados (se llaman por su nombre, en cualquier orden). Los parámetros entre [ ] son posicionales opcionales. Ambos pueden llevar un valor por defecto con = valor, o ser nulables con ?.
➡️ 2. Arrow Functions
Resultado:
Prueba un número
// Función normalint cuadrado(int x) {
return x * x;
}
// La misma función, como arrow function (una sola expresión)int cuadrado(int x) => x * x;
🔐 3. Closures (funciones que recuerdan su estado)
Estado actual del contador:
Llama al closure varias veces
Function crearContador() {
int valor = 0; // esta variable vive "encerrada" dentro del closure return () {
valor++;
return valor;
};
}
final incrementar = crearContador();
print(incrementar()); // 1
print(incrementar()); // 2
print(incrementar()); // 3 (recuerda el valor entre llamadas)
💡 ¿Qué es un closure?
Es una función que "captura" variables de su entorno y las mantiene vivas incluso después de que la función que las creó haya terminado de ejecutarse. Cada llamada a crearContador() generaría un contador independiente con su propio estado.
🎯 Conceptos Clave
Parámetros nombrados
{String nombre = '...'}- Se llaman por nombre:
fn(nombre: 'x')
Arrow functions
=> expresion;- Solo para una única expresión de retorno
Closures
- Capturan variables del entorno
- Mantienen estado entre llamadas
💪 Ejercicio Práctico
Practica funciones
- Crea
String formatear(String texto, {bool mayusculas = false})que devuelva el texto en mayúsculas si se indica. - Convierte una función de suma de dos parámetros en arrow function.
- Crea un closure
crearMultiplicador(int factor)que devuelva una función que multiplique cualquier número por ese factor.
Solución 1
String formatear(String texto, {bool mayusculas = false}) {
return mayusculas ? texto.toUpperCase() : texto;
}
Solución 2
int sumar(int a, int b) => a + b;
Solución 3
Function(int) crearMultiplicador(int factor) {
return (int n) => n * factor;
}
final porTres = crearMultiplicador(3);
print(porTres(5)); // 15