parametri opționali și numiți în Dart

Funcții Dart 1.0

Parametrii între [ ] sunt poziționali opționali; cei între { } sunt numiți și se dau cu nume: valoare.

Sintaxă
void f(int a, [int b = 0, int? c])        // poziționali opționali
void g(int a, {int b = 0, int? c})        // numiți
void h({required String nume})            // numit obligatoriu

g(1, b: 2, c: 3);

Ce face parametri opționali și numiți

Parametrii obișnuiți sunt poziționali și obligatorii. După ei poți avea fie parametri poziționali opționali, între paranteze drepte [...], fie parametri numiți, între acolade {...}, dar nu ambele în aceeași funcție.

Parametrii numiți se dau la apel cu numele lor: trimite(text, prioritar: true). Ordinea lor nu contează și codul se citește ușor. Sunt opționali implicit; cu required devin obligatorii.

Un parametru opțional are fie o valoare implicită (= 0, care trebuie să fie constantă), fie un tip nullabil (int?), caz în care primește null dacă lipsește.

Parametri

Parametru Descriere
[Tip x = implicit] Poziționali opționali: se dau în ordine, de la stânga la dreapta, și pot lipsi de la final.
{Tip x = implicit} Numiți: se dau cu x: valoare, în orice ordine.
required Face un parametru numit obligatoriu.

Exemple

Exemplul 1: Parametri poziționali opționali

titlu are valoare implicită, oras poate fi null.

String salut(String nume, [String titlu = 'dl./dna.', String? oras]) {
  final din = oras == null ? '' : ' din $oras';
  return 'Bună ziua, $titlu $nume$din!';
}

void main() {
  print(salut('Popescu'));
  print(salut('Ionescu', 'dr.'));
  print(salut('Marin', 'prof.', 'Pitești'));
}

Rezultat

Bună ziua, dl./dna. Popescu!
Bună ziua, dr. Ionescu!
Bună ziua, prof. Marin din Pitești!

Exemplul 2: Parametri numiți

La apel, numele arată clar ce înseamnă fiecare valoare; ordinea nu contează.

String formatPret(double suma, {String moneda = 'lei', int zecimale = 2, bool cuTva = false}) {
  final total = cuTva ? suma * 1.19 : suma;
  return '${total.toStringAsFixed(zecimale)} $moneda';
}

void main() {
  print(formatPret(100));
  print(formatPret(100, cuTva: true));
  print(formatPret(49.99, zecimale: 0, moneda: 'euro'));
}

Rezultat

100.00 lei
119.00 lei
50 euro

Exemplul 3: Parametri numiți în constructor

Stilul folosit peste tot în Flutter: parametri numiți cu this. și required.

class Comanda {
  final String client;
  final int bucati;
  final bool livrare;
  Comanda({required this.client, this.bucati = 1, this.livrare = false});

  @override
  String toString() => '$client: $bucati buc., ${livrare ? 'cu' : 'fără'} livrare';
}

void main() {
  print(Comanda(client: 'Ana'));
  print(Comanda(livrare: true, client: 'Vlad', bucati: 3));
}

Rezultat

Ana: 1 buc., fără livrare
Vlad: 3 buc., cu livrare

Greșeli frecvente

  • Amestecul [...] și {...} în aceeași funcție: nu este permis.
  • Parametru numit nenul fără valoare implicită și fără required: The parameter 'x' can't have a value of 'null' because of its type.
  • Valoare implicită care nu este constantă ({DateTime d = DateTime.now()}): folosește DateTime? d și d ??= DateTime.now() în corp.

Comenzi înrudite

  • required: Face un parametru numit obligatoriu: apelul fără el nu compilează.
  • funcții: Blocuri de cod cu nume, care primesc parametri și returnează o valoare; în Dart sunt și obiecte.
  • constructori: Funcțiile speciale care creează și inițializează obiectele unei clase.