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:

saludar(nombre: ..., edad: ...)
Hola, Invitado!

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:

cuadrado(5)
25

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:

incrementar()
Valor actual: 0

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

  1. Crea String formatear(String texto, {bool mayusculas = false}) que devuelva el texto en mayúsculas si se indica.
  2. Convierte una función de suma de dos parámetros en arrow function.
  3. 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