← Flutter & Dart

Dart avanzado

¿Qué tipos de parámetros existen en Dart (posicionales, opcionales, nombrados) y cómo se declaran?

Ver respuesta — intenta responderla en voz alta primero

Dart tiene parámetros posicionales obligatorios, posicionales opcionales (entre []) y nombrados (entre {}). Los nombrados se pasan con nombre: valor y por defecto son opcionales, salvo que los marques con required. Puedes dar valores por defecto a los opcionales y nombrados.

  • Posicionales obligatorios: los de siempre. Importa el orden. suma(a, b).
  • Posicionales opcionales ([ ]): puedes omitirlos. Si no llegan, valen null (o el valor por defecto que definas).
  • Nombrados ({ }): se pasan indicando el nombre. Mejoran la legibilidad y no dependen del orden. Son opcionales salvo que uses required.

En Flutter casi todo usa parámetros nombrados (por eso escribes Container(width: 100, height: 50)). Además, las arrow functions (=>) son azúcar sintáctico para funciones de una sola expresión.

// Posicionales obligatorios
int suma(int a, int b) => a + b;

// Posicional opcional con valor por defecto
String saludar(String nombre, [String saludo = "Hola"]) {
  return "$saludo, $nombre";
}

// Nombrados: uno requerido y uno con valor por defecto
String describir({required String nombre, int edad = 0}) {
  return "$nombre tiene $edad años";
}

void main() {
  print(suma(2, 3)); // 5

  print(saludar("Mike")); // "Hola, Mike"
  print(saludar("Mike", "Qué onda")); // "Qué onda, Mike"

  print(describir(nombre: "Ana")); // "Ana tiene 0 años"
  print(describir(nombre: "Ana", edad: 30)); // "Ana tiene 30 años"

  // El orden de los nombrados no importa
  print(describir(edad: 25, nombre: "Luis")); // "Luis tiene 25 años"
}

Olvidar required en un parámetro nombrado que no tiene valor por defecto y no es nullable. Con null safety, Dart te obliga: un parámetro nombrado no-nullable sin valor por defecto tiene que ser required, o no compila. Muchos juniors intentan escribir String describir({String nombre}) y no entienden por qué falla.

"Dart tiene parámetros posicionales obligatorios, posicionales opcionales que van entre corchetes, y parámetros nombrados que van entre llaves y se pasan como nombre: valor. Los nombrados son opcionales por defecto, pero si son no-nullable y no tienen valor por defecto, hay que marcarlos con required. En Flutter casi todo usa parámetros nombrados porque hace el código mucho más legible, como en los constructores de los widgets."

Reto rápido

¿Por qué esta función no compila y cómo lo arreglas?

String etiqueta({String texto}) => texto;
Ver respuesta

No compila porque texto es un parámetro nombrado no-nullable sin valor por defecto, y null safety exige que sea required. Arreglos posibles:

  • String etiqueta({required String texto}) => texto;
  • String etiqueta({String texto = ""}) => texto;
  • String etiqueta({String? texto}) => texto ?? "";