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
dynamicpeste 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.