required în Dart

Funcții Dart 2.12

Face un parametru numit obligatoriu: apelul fără el nu compilează.

Sintaxă
void f({required String nume, int varsta = 0})
Clasa({required this.camp});

Ce face required

Parametrii numiți (cei din acolade) sunt opționali implicit. required în fața unuia îl face obligatoriu: dacă apelul nu-l dă, analizorul raportează eroare încă de la compilare.

Ai astfel avantajele ambelor lumi: apelul se citește ușor (Utilizator(nume: 'Ana', email: '...')), dar nu poți uita un câmp important. Un parametru required poate avea și tip nullabil: atunci valoarea trebuie dată explicit, chiar dacă este null.

required se folosește doar la parametri numiți. Parametrii poziționali obișnuiți sunt deja obligatorii.

Exemple

Exemplul 1: Parametri numiți obligatorii

catre și subiect trebuie date; cc este opțional.

void trimiteEmail({required String catre, required String subiect, String? cc}) {
  print('Către: $catre');
  print('Subiect: $subiect');
  if (cc != null) print('CC: $cc');
  print('---');
}

void main() {
  trimiteEmail(catre: 'ana@exemplu.ro', subiect: 'Ședința de luni');
  trimiteEmail(subiect: 'Factură', catre: 'contabil@firma.ro', cc: 'sef@firma.ro');
  // trimiteEmail(catre: 'ana@exemplu.ro'); // eroare: lipsește 'subiect'
}

Rezultat

Către: ana@exemplu.ro
Subiect: Ședința de luni
---
Către: contabil@firma.ro
Subiect: Factură
CC: sef@firma.ro
---

Exemplul 2: required în constructor

Un obiect Elev nu poate fi creat fără nume și clasă.

class Elev {
  final String nume;
  final String clasa;
  final double? medie;
  Elev({required this.nume, required this.clasa, this.medie});
}

void main() {
  final e = Elev(nume: 'Darius', clasa: 'a X-a A');
  print('${e.nume}, ${e.clasa}, medie: ${e.medie ?? 'neîncheiată'}');
}

Rezultat

Darius, a X-a A, medie: neîncheiată

Exemplul 3: required cu tip nullabil

telefon poate fi null, dar trebuie scris explicit la apel, ca să fie o decizie conștientă.

void inregistreaza({required String nume, required String? telefon}) {
  print('$nume: ${telefon ?? 'fără telefon'}');
}

void main() {
  inregistreaza(nume: 'Raluca', telefon: '0733123456');
  inregistreaza(nume: 'Costin', telefon: null);
}

Rezultat

Raluca: 0733123456
Costin: fără telefon

Greșeli frecvente

  • Apel fără parametrul obligatoriu: The named parameter 'subiect' is required, but there's no corresponding argument.
  • required la un parametru pozițional: void f(required int x) nu compilează.
  • required plus valoare implicită: nu are sens, parametrul nu poate fi omis oricum (analizorul dă eroare).

Comenzi înrudite

  • parametri opționali și numiți: Parametrii între [ ] sunt poziționali opționali; cei între { } sunt numiți și se dau cu nume: valoare.
  • constructori: Funcțiile speciale care creează și inițializează obiectele unei clase.
  • null safety (? ! ?? ??=): Tipurile nu pot fi null decât dacă au ?; operatorii !, ?? și ??= lucrează cu valorile care pot lipsi.