Ce face external
external înseamnă „declarația este aici, dar implementarea vine din afară”. Funcția nu are corp; compilatorul o leagă de cod scris în alt limbaj. În programele obișnuite îl întâlnești în două situații: apelul funcțiilor C prin dart:ffi (cu adnotarea @Native) și apelul codului JavaScript pe web (cu dart:js_interop și @JS()).
Multe clase din SDK folosesc external intern: de exemplu, DateTime.now() sau print sunt declarate external și implementate diferit pe VM, pe web și în aplicațiile native.
Pentru începători este important să-l recunoști când citești cod, nu să-l scrii: o funcție external fără o adnotare sau o bibliotecă care s-o lege dă eroare la rulare.
Exemple
Exemplul 1: Funcția C getpid prin dart:ffi
@Native leagă funcția Dart de funcția C getpid din biblioteca standard C (macOS, Linux). Numărul procesului diferă la fiecare rulare.
import 'dart:ffi';
@Native<Int32 Function()>(symbol: 'getpid')
external int getpid();
void main() {
print('Rulez în procesul ${getpid()}.');
}
Rezultat posibil (diferă la fiecare rulare)
Rulez în procesul 48213.
Exemplul 2: Funcție JavaScript pe web
Compilat pentru browser (dart compile js sau Flutter web), apelul deschide fereastra alert a browserului.
import 'dart:js_interop';
@JS('alert')
external void arataMesaj(String mesaj);
void main() {
arataMesaj('Bun venit pe dexblog.ro!');
}
Rezultat în browser
(apare o fereastră cu mesajul „Bun venit pe dexblog.ro!”)
Greșeli frecvente
- O funcție
externalfără adnotare care s-o lege: programul se compilează, dar la apel apare o eroare (NoSuchMethodErrorsauCouldn't resolve native function). - Semnătura din
@Nativecare nu se potrivește cu funcția C (alt număr sau alt tip de parametri): rezultate greșite sau oprirea programului. - Folosirea lui
dart:ffiîn cod compilat pentru web: nu este disponibil acolo; pe web se foloseștedart:js_interop.
Comenzi înrudite
funcții: Blocuri de cod cu nume, care primesc parametri și returnează o valoare; în Dart sunt și obiecte.import: Face disponibile în fișierul curent numele publice ale altei biblioteci: din SDK, dintr-un pachet sau din proiect.dart compile: Compilează un program Dart într-un executabil nativ, în JavaScript, WebAssembly sau într-un snapshot.