external în Dart

Clase și obiecte Dart 1.0 (cu @Native din Dart 3.0)

Declară o funcție sau un câmp al cărui corp este scris în altă parte: în C (dart:ffi), JavaScript sau în SDK.

Sintaxă
external Tip functie(Parametri);          // corpul este în altă parte

@Native<Int32 Function()>(symbol: 'getpid')
external int getpid();                    // funcție C, prin dart:ffi

@JS() external void alert(String mesaj);  // funcție JavaScript, pe web

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 external fără adnotare care s-o lege: programul se compilează, dar la apel apare o eroare (NoSuchMethodError sau Couldn't resolve native function).
  • Semnătura din @Native care 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ște dart: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.