← Назад к вопросам

Что такое external в Dart?

1.7 Middle🔥 112 комментариев
#Dart#Нативная интеграция

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

External в Dart

External — это ключевое слово в Dart, которое объявляет функцию или переменную, реализованная в другом языке программирования (обычно C, C++ или JavaScript). Это часть Foreign Function Interface (FFI) — механизма для взаимодействия с нативным кодом.

Основное назначение

Keyword external говорит Dart-ру: "Реализация этой функции находится вне Dart кода". Это позволяет вызывать код на C/C++, например:

// Объявление функции из C библиотеки
extern "C" {
  int add(int a, int b);
}

// В Dart коде
@Native<Int Function(Int, Int)>(symbol: add)
external int add(int a, int b);

void main() {
  print(add(5, 3)); // Вызовет C функцию
}

FFI (Foreign Function Interface)

Основной способ использования external — через Dart FFI:

import dart:ffi;
import package:ffi/ffi.dart;

// Загружаем нативную библиотеку
final dylib = DynamicLibrary.open(libexample.so); // Linux
// или .dylib на macOS, .dll на Windows

// Получаем функцию из библиотеки
typedef NativeSqrt = Double Function(Double);
typedef SqrtFunc = double Function(double);

final sqrt = dylib
  .lookup<NativeFunction<NativeSqrt>>(sqrt)
  .asFunction<SqrtFunc>();

void main() {
  print(sqrt(16.0)); // 4.0
}

Отличие от Platform Channel

  • FFI/external — прямой вызов нативных функций, быстрее
  • Platform Channel — асинхронный обмен сообщениями, безопаснее

Dля CPU-интенсивных операций используй FFI, для логики платформы — Platform Channel.

Практические примеры

Криптография

// Вызов OpenSSL функций напрямую
external int SHA256(Pointer<Uint8> data, int len, Pointer<Uint8> out);

Математика

// BLAS (Basic Linear Algebra Subprograms)
external void dgemm_(Pointer<Char> transa, ...);

Работа с графикой

// Низкоуровневые операции с пикселями
external void processImage(Pointer<Uint32> pixels, int width, int height);

Важные моменты

  • Производительность — FFI намного быстрее Platform Channel (вызов почти напрямую)
  • Безопасность — нужно корректно управлять памятью (Pointer, malloc/free)
  • Кроссплатформенность — придётся писать разные реализации для каждой платформы
  • Сложность — требует знания C/C++ и управления памятью

External подходит для производительности-критичных операций, где нужна максимальная скорость.

Что такое external в Dart? | PrepBro