if și else în Dart

Execută un bloc de cod doar dacă o condiție este adevărată; else tratează cazul contrar.

Sintaxă
if (conditie) {
  ...
} else if (alta) {
  ...
} else {
  ...
}

if (valoare case Pattern) { ... }   // Dart 3
conditie ? a : b                    // operatorul ternar

Ce face if și else

if verifică o condiție de tip bool și execută blocul dintre acolade doar dacă este true. else if adaugă alte condiții, verificate de sus în jos, iar else prinde restul. Condiția se pune între paranteze și trebuie să fie chiar bool: Dart nu transformă automat numere sau texte în adevărat/fals.

Pentru alegeri simple între două valori există operatorul ternar conditie ? a : b.

Din Dart 3, if-case verifică un pattern și extrage valori în același timp: if (json case {'nume': String nume}) .... Variabilele din pattern există doar în blocul if.

Exemple

Exemplul 1: Calificativul unei note

Se execută doar prima ramură adevărată.

String calificativ(int nota) {
  if (nota >= 9) {
    return 'foarte bine';
  } else if (nota >= 7) {
    return 'bine';
  } else if (nota >= 5) {
    return 'suficient';
  } else {
    return 'insuficient';
  }
}

void main() {
  for (final nota in [10, 8, 5, 3]) {
    print('nota $nota: ${calificativ(nota)}');
  }
}

Rezultat

nota 10: foarte bine
nota 8: bine
nota 5: suficient
nota 3: insuficient

Exemplul 2: Operatorul ternar

? : alege o valoare în funcție de condiție, pe un singur rând.

void main() {
  for (final bucati in [1, 3]) {
    final text = bucati == 1 ? 'produs' : 'produse';
    print('Ai $bucati $text în coș.');
  }
}

Rezultat

Ai 1 produs în coș.
Ai 3 produse în coș.

Exemplul 3: if-case cu pattern

Condiția verifică forma datelor și extrage nume și varsta doar dacă au tipurile cerute.

void verifica(Map<String, Object?> date) {
  if (date case {'nume': String nume, 'varsta': int varsta} when varsta >= 18) {
    print('$nume poate vota.');
  } else {
    print('Date incomplete sau persoană minoră: $date');
  }
}

void main() {
  verifica({'nume': 'Ioana', 'varsta': 22});
  verifica({'nume': 'Matei', 'varsta': 15});
  verifica({'nume': 'Sorin'});
}

Rezultat

Ioana poate vota.
Date incomplete sau persoană minoră: {nume: Matei, varsta: 15}
Date incomplete sau persoană minoră: {nume: Sorin}

Greșeli frecvente

  • if (lista.length) sau if (text): Conditions must have a static type of 'bool'. Scrie lista.isNotEmpty.
  • = în loc de == în condiție: if (x = 5) nu compilează, pentru că rezultatul nu este bool.
  • Lanțuri lungi de else if pe aceeași valoare: o expresie switch este mai clară.

Comenzi înrudite

  • switch: Alege un bloc de cod după valoarea sau forma unei expresii; în Dart 3 fiecare case este un pattern.
  • expresii switch: Forma de switch care produce o valoare: fiecare ramură este pattern => expresie.
  • when (guard): Adaugă o condiție suplimentară la un pattern din switch sau if-case; cazul se alege doar dacă e adevărată.
  • pattern-uri (destructurare): Desfac o valoare (record, listă, map, obiect) în variabile separate, într-o singură declarație.