Комментарии (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 подходит для производительности-критичных операций, где нужна максимальная скорость.