تكرار السؤال: …
الإجابة المختصرة
تعتمد Platform Channels على نقل الرسائل غير المتزامن وتسلسل الـ Binary عبر خيط المنصة، بينما يتصل Dart FFI مباشرة بدوال C/C++ في الذاكرة المشتركة بشكل متزامن وبسرعة الكود المترجم الأصلي.
الشرح
في MethodChannel، يمر كل استدعاء عبر: تشفير المعاملات بواسطة StandardMessageCodec، الإرسال عبر Flutter Engine إلى الـ Platform Thread، فك التشفير، تنفيذ الكود في Java/Kotlin أو Obj-C/Swift، وتكرار نفس الدورة في رحلة العودة غير المتزامنة. هذا يسبب اختناقاً إذا كان معدل نقل البيانات ضخماً (مثل معالجة الكاميرا أو تدفقات البلوتوث). في المقابل، يتيح Dart FFI (Foreign Function Interface) توجيه المؤشرات في الذاكرة واستدعاء دوال المكتبات المجمعة مباشرة دون أي وسيط أو تسلسل، مما يجعله مثالياً لمعالجة الإشارات وخوارزميات التشفير والصور.
مثال بالكود
import 'dart:ffi';
import 'dart:io';
import 'package:flutter/services.dart';
typedef NativeAdd = Int32 Function(Int32, Int32);
typedef DartAdd = int Function(int, int);
// FFI: direct, synchronous call into C — no message serialization, no platform thread hop
final DynamicLibrary lib =
Platform.isAndroid ? DynamicLibrary.open('libnative.so') : DynamicLibrary.process();
final DartAdd nativeAdd = lib.lookupFunction<NativeAdd, DartAdd>('native_add');
// Platform channel: asynchronous, messages are serialized and handled on the platform thread
const channel = MethodChannel('com.example/math');
Future<void> demo() async {
final direct = nativeAdd(20, 22); // 42, immediately
final viaChannel = await channel.invokeMethod<int>('add', {'a': 20, 'b': 22}); // 42, later
debugPrint('$direct $viaChannel');
}أخطاء شائعة
- استخدام MethodChannel لنقل بيانات فيديو خام (Raw Video Frames) بدقة عالية، مما يتسبب في إجهاد شديد للـ Memory Bandwidth وتقطيع الواجهة.