DMarlon Studio

Lección 14 · 14 de 20

Parámetros con nombre y opcionales · Dart

Haga funciones flexibles en Dart con parámetros opcionales entre [ ], parámetros con nombre entre { }, valores por defecto y required.

Dart · Parámetros con nombre y opcionales en DMarlon Studio: el código del ejemplo y su salida en la terminal

Un parámetro entre corchetes es opcional y posicional: en greet(String name, [String greeting = 'Hello']), el saludo puede faltar y entonces vale 'Hello'. greet('Marta') da Hello, Marta! y greet('Marta', 'Good morning') cambia el saludo.

Los parámetros entre llaves son parámetros con nombre: al llamar a la función se escribe el nombre delante del valor, como nights: 3. Así se ve enseguida qué significa cada número, y pueden ir en cualquier orden: book('Hotel Mar', guests: 3, nights: 2).

Los parámetros con nombre son opcionales salvo que lleven `required`: nights es obligatorio y, si falta, como en la línea comentada, Dart no compila. Los demás tienen un valor por defecto: sin guests se cuentan 2 personas y sin breakfast, sin desayuno.

La función button muestra para qué sirven de verdad: las llamadas largas se leen solas. Es la forma en que se escribe Flutter: Text('Hi', style: ..., textAlign: ...) o Padding(padding: ..., child: ...) son llamadas con parámetros con nombre, y es lo que genera DMarlon Studio con los widgets que usted coloca en el lienzo de teléfono.

Código · main.dart

// Optional positional parameters go in [ ], with a default value.String greet(String name, [String greeting = 'Hello']) => '$greeting, $name!';// Named parameters go in { }; required makes one compulsory.void book(String hotel, {required int nights, int guests = 2, bool breakfast = false}) {  int cost = nights * guests * 45;  if (breakfast) cost += nights * guests * 8;  String extra = breakfast ? ' with breakfast' : '';  print('$hotel: $nights nights, $guests guests$extra = $cost euros');}// Named parameters with defaults make long calls easy to read.String button(String text, {String colour = 'blue', bool rounded = true}) =>    '[$text] $colour${rounded ? ', rounded' : ''}';void main() {  print(greet('Marta'));  print(greet('Marta', 'Good morning'));  // Named arguments carry their name and can go in any order.  book('Hotel Sol', nights: 3);  book('Hotel Mar', guests: 3, nights: 2);  book('Casa Rural', nights: 4, breakfast: true, guests: 4);  // book('Hotel Sol');  // Error: nights is required.  print(button('Buy'));  print(button('Cancel', colour: 'grey', rounded: false));}

Salida · dart run main.dart

Hello, Marta!
Good morning, Marta!
Hotel Sol: 3 nights, 2 guests = 270 euros
Hotel Mar: 2 nights, 3 guests = 270 euros
Casa Rural: 4 nights, 4 guests with breakfast = 848 euros
[Buy] blue, rounded
[Cancel] grey

Para recordar

  • [tipo nombre = valor] es opcional y va por posición.
  • {tipo nombre = valor} va por nombre: nombre: valor.
  • Los argumentos con nombre pueden ir en cualquier orden.
  • required hace obligatorio un parámetro con nombre.
  • Flutter usa parámetros con nombre en todos sus widgets.

Ejercicio

Escriba una función pizza con un parámetro size obligatorio con nombre y los parámetros cheese (por defecto true) y toppings (por defecto 0), que escriba el pedido y su precio; llámela de tres maneras distintas.