dart-funciones-parametros-flecha

Funciones en Dart: parámetros nombrados y sintaxis de flecha

  • 4 min

Una función es un bloque de código reutilizable que realiza una tarea concreta.

Si las variables son los datos, las Funciones son la acción. Son bloques de código que podemos llamar cuando los necesitamos.

Si vienes de otros lenguajes, el concepto te resultará obvio. Sin embargo, Dart tiene una forma muy particular de manejar los parámetros que es distinta a Java o C#, y que resulta ser la piedra angular de cómo se escribe código en Flutter.

Hoy vamos a ver no solo cómo crear funciones, sino cómo hacerlo “al estilo Dart”.

La estructura básica

Una función en Dart se define indicando el tipo de retorno, el nombre y los parámetros.

// Tipo de retorno - Nombre - Parámetros
int sumar(int a, int b) {
  return a + b;
}

void main() {
  var resultado = sumar(5, 10);
  print(resultado); // 15
}
Copied!

Si la función no devuelve nada, usamos void. Hasta aquí, nada nuevo bajo el sol.

Funciones de flecha

A los programadores nos gusta escribir poco código (siempre que sea legible). Cuando una función contiene una única instrucción que devuelve un valor, podemos usar la sintaxis de flecha =>.

Esto es lo que llamamos “Syntactic Sugar” (azúcar sintáctico). Mira la diferencia:

// Forma clásica
int multiplicar(int a, int b) {
  return a * b;
}

// Forma Flecha (Equivalente)
int multiplicarFlecha(int a, int b) => a * b;
Copied!

La flecha => reemplaza tanto a las llaves {} como a la palabra return. Es muy común usarla en Flutter para callbacks simples (por ejemplo, al pulsar un botón).

Tipos de parámetros

Aquí es donde Dart brilla. Tenemos dos formas de definir los parámetros de una función: Posicionales y Nombrados.

Parámetros posicionales

Son los obligatorios y dependen del orden en que los pasas. Es lo que hemos visto en el ejemplo de sumar(int a, int b).

  • Ventaja: Son breves.
  • Desventaja: Si tienes una función con 5 parámetros, es imposible recordar qué va en cada posición. crearUsuario("Luis", 30, true, "Madrid", null) es difícil de leer.

Parámetros nombrados

Esta es la sintaxis nativa de Flutter. Para definir parámetros nombrados, envolvemos los argumentos entre llaves { }.

Al llamar a la función, debemos especificar el nombre del parámetro seguido de dos puntos. El orden ya no importa.

// Definición usando llaves { }
void crearUsuario({String? nombre, int? edad}) {
  print("Usuario: $nombre, Edad: $edad");
}

void main() {
  // Llamada súper legible (el orden da igual)
  crearUsuario(edad: 30, nombre: "Luis"); 
}
Copied!

Fíjate que al usar {} los parámetros se vuelven opcionales por defecto (por eso he usado String? y int?, porque podrían ser nulos si no los enviamos).

required y valores por defecto

Como hemos dicho, los parámetros nombrados {} son opcionales por naturaleza. Pero, ¿y si queremos la legibilidad de los nombres pero la obligatoriedad de los datos?

Para eso tenemos la palabra clave required y los valores por defecto.

La palabra clave required

Le dice al compilador: “Este parámetro es nombrado (se llama por su nombre), pero es OBLIGATORIO pasarlo”.

void configurarWifi({required String ssid, required String password}) {
  print("Conectando a $ssid con $password");
}

// configurarWifi(); // ❌ Error: Faltan parámetros requeridos
configurarWifi(ssid: "MiCasa", password: "123"); // ✅ Correcto
Copied!

Valores por defecto

Si un parámetro es opcional pero no queremos lidiar con nulos, podemos asignarle un valor inicial.

void saludar({String nombre = "Invitado"}) {
  print("Hola, $nombre");
}

saludar(); // Imprime: Hola, Invitado
saludar(nombre: "Ana"); // Imprime: Hola, Ana
Copied!

Argumentos mixtos

Podemos mezclar ambos mundos. Dart permite tener primeros parámetros posicionales (obligatorios por orden) y luego parámetros nombrados (opcionales u obligatorios por nombre).

Es importante saber que los posicionales siempre van primero.

// 'mensaje' es posicional, 'veces' es nombrado
void repetirMensaje(String mensaje, {int veces = 1}) {
  for (int i = 0; i < veces; i++) {
    print(mensaje);
  }
}

void main() {
  repetirMensaje("Hola"); // Usa valor por defecto
  repetirMensaje("Hola", veces: 5); // Especifica repeticiones
}
Copied!

Funciones como valores

En Dart, las funciones son objetos. Esto significa que puedes guardar una función en una variable o pasar una función como parámetro a otra función.

Esto suena abstracto, pero es lo que haces cada vez que configuras un botón en Flutter:

void miAccion() {
  print("Botón pulsado");
}

// Imagina que esto es un widget de Flutter
TextButton(
  onPressed: miAccion, // Pasamos la función SIN paréntesis
  child: Text("Púlsame"),
)
Copied!