Object.noSuchMethod în Dart

Metoda apelată când se cere unui obiect o metodă sau proprietate pe care nu o are (prin dynamic).

Sintaxă
dynamic noSuchMethod(Invocation invocation)

Ce face Object.noSuchMethod

Când apelezi pe o variabilă dynamic o metodă care nu există, Dart apelează noSuchMethod al obiectului. Implementarea din Object aruncă NoSuchMethodError. Dacă o suprascrii, poți trata singur apelul: îl afișezi, îl redirecționezi sau returnezi o valoare.

Parametrul Invocation descrie apelul: memberName (un Symbol cu numele), positionalArguments, namedArguments și dacă este o metodă, un getter sau un setter (isMethod, isGetter, isSetter).

Este o unealtă avansată, folosită în obiecte simulate pentru teste (mock-uri) și în proxy-uri. În codul obișnuit, cu tipuri statice, compilatorul oprește din start apelurile la metode inexistente, deci noSuchMethod nu ajunge să fie apelat.

Parametri

Parametru Descriere
invocation Descrierea apelului: nume, argumente, tip de membru.

Ce returnează

Orice valoare (dynamic), folosită ca rezultat al apelului.

Exemple

Exemplul 1: Un obiect care înregistrează apelurile

class Jurnal {
  final apeluri = <String>[];

  @override
  dynamic noSuchMethod(Invocation invocation) {
    var nume = invocation.memberName.toString();
    apeluri.add('$nume ${invocation.positionalArguments} ${invocation.namedArguments}');
    return null;
  }
}

void main() {
  dynamic j = Jurnal();
  j.trimiteEmail('ana@exemplu.ro', subiect: 'Bună');
  j.salveaza(42);
  for (var a in (j as Jurnal).apeluri) {
    print(a);
  }
}

Rezultat

Symbol("trimiteEmail") [ana@exemplu.ro] {Symbol("subiect"): Bună}
Symbol("salveaza") [42] {}

Exemplul 2: Eroarea implicită

Fără noSuchMethod propriu, apelul unei metode inexistente prin dynamic aruncă NoSuchMethodError.

void main() {
  dynamic text = 'Iași';
  print(text.toUpperCase());
  try {
    text.zbor();
  } on NoSuchMethodError {
    print('String nu are metoda zbor()');
  }
}

Rezultat

IAȘI
String nu are metoda zbor()

Greșeli frecvente

  • Folosești dynamic peste tot ca să eviți erorile de tip. Greșelile de scriere ale numelor de metode devin erori la rulare (NoSuchMethodError) în loc de erori de compilare.

Comenzi înrudite

  • Object: Clasa de bază a tuturor claselor Dart, cu excepția lui Null; runtimeType dă tipul real al unui obiect.
  • Symbol: Un nume de identificator (metodă, câmp, parametru) păstrat ca valoare; se scrie #nume.
  • dynamic: Tipul care dezactivează verificarea statică: orice metodă se poate apela, verificarea se face la rulare.
  • Function.apply: Apelează o funcție cu argumente date ca listă (poziționale) și Map (numite), construite în timpul rulării.