المقدمة
تفتكر نقدر نتحكم في كل إمكانيات الموبايل باستخدام Flutter بس؟ 🤔
طب لو اشتغلت على بروجكت واتطلب منك Feature محتاجة توصل لحاجات من الـ platform زي الكاميرا أو تربط بسينسور معين هتعمل ايه؟
وقتها هتكتشف إن Flutter لوحده مش بيديك Access مباشر لكل حاجة في Android وiOS.
تخيل إنك تقدر تستخدم كل إمكانيات الموبايل من غير ما تسيب Flutter… ده بالظبط اللي بتقدمه Platform Channels 🚀
في المقال ده هنعرف إيه هي Platform Channels، إمتى نستخدمها، و ازاي بتشغل👀

📌 هنتكلم النهاردة عن:
- يعني إيه Platform Channels
- Platform Channel Architecture
- إزاي Platform Channels بتشتغل
- أنواع Platform Channels
- إمتى نستخدمها
- طريقة نقل البيانات (Codecs)
- Platform Embedder
- الخاتمة
1 - إيه هي Platform Channels؟ 🤔
في مرة كنت محتاجة أعمل ميزة live tracking، وكان المطلوب نبعت الـ location كل ثانية للسيرفر.
المشكلة إننا كنا محتاجين نبعت data بسرعة، و JSON وقتها كان بطيء نسبيًا.
فاضطريت أستخدم حاجة اسمها FlatBuffers، وهي طريقة لنقل البيانات زي JSON، بس أسرع بكتير وبتستخدم مساحة أقل ، لكن المشكلة إن Flutter ماكانش بيدعمها بشكل مباشر.
هنا ظهر الحل 👇 استخدمت حاجة اسمها Method Channel، واللي سمحتلي أبعت البيانات من Dart للـ Native، وأرجّع النتيجة تاني بسهولة.
خلينا نسأل نفسنا الاول سؤال غريب شوية : هو مخنا بيشتغل لوحده ؟
المخ دايمًا بيتعامل مع العالم الخارجي عن طريق الحواس: العين، الأذن، اللمس…
لكن هو نفسه مش بيشوف ولا بيسمع بشكل مباشر، لازم يكون فيه وسيط ينقل له المعلومات.
💡 وده بالظبط نفس فكرة Platform Channels:
Flutter لوحده مش شايف العالم الخارجي… مايعرفش يتعامل مباشرة مع الكاميرا أو الـ GPS أو أي حاجة في الجهاز.
لازم يكون فيه قناة توصله بالـ Native.
يعني ايه Platform Channels ؟
هي ببساطة الجسر اللي بيربط بين عالم Flutter وعالم الـ Native ، Android & iOS وبيسمح إنهم يتواصلوا مع بعض بسلاسة.
من خلالها تقدر:
- توصل لأي حاجة في Android أو iOS
- تستخدم SDKs Flutter مش بيدعمها
- تنفّذ عمليات تقيلة باستخدام Native Code بشكل أسرع
ما هي Platform Channel Architecture؟ 🧠
علشان نفهم الموضوع بشكل أوضح، لازم نعرف الاول Platform Channels موجودة فين جوه Flutter.
Flutter بيتكوّن من 3 Layers أساسية:
- Flutter Framework (وده اللي بنكتب فيه كود Dart)
- Flutter Engine ( قلب فلاتر اللي بيشغل و بيرسم التطبيق )
- Flutter Embedder ( دا الجزء اللي بيربط فلاتر بال operating system )
الـ Platform Channels موجودة في طبقة الـ Flutter Engine.
طب كدا ايه اللي بيحصل و ازاي بيتواصلوا مع بعض :
- كود Dart بيتواصل مع الـ Engine
- والـ Engine بدوره بيتواصل مع الكود الـ Native و Android / iOS
وكل التواصل ده بيكون Asynchronous، علشان ما يوقفش الـ UI ويحافظ على سلاسة الأداء زي كدا مخنا مش بيستني يعمل حاجة واحدة بس لا بنتكلم و بناكل و بنتمشي عادي ✨

خلينا دلوقت نشوف ازاي platform channel بيشتغل؟
تخيل إن عندك تطبيق Flutter هو مدينة ذكية 🏙️ وفي المدينة دي فيه شخص اسمه Dart UI عايش جوه Flutter، لكن هو لوحده مش بيعرف يتعامل مباشرة مع العالم الخارجي (الكاميرا، GPS، الملفات).
ف ايه اللي هيحصل و ازاي هيتكلموا مع بعض ؟
1️⃣ Dart بيطلب مساعدة قرر انه عايز يفتح الكاميرا 📸
فبيقول: أنا محتاج كاميرا دا زي المخ اما بيعوز حاجة مثلا لو قالك انك جعان دلوقت ف هو بس بيدي الامر
لكن هو مايعرفش يوصل لها بنفسه، فبيكتب الرسالة ويبعتها.
2️⃣ الرسالة بتتغلف وتتبعَت
الرسالة ما بتروحش كده علطول
لا، دي بتتغلف في شكل Binary Data وبتمر على وسيط اسمه Binary Messenger
وده عامل زي الجهاز العصبي في الانسان لان الإشارات بتمشي في صورة نبضات كهربائية مش كلام أو جمل
وده يشبه جدًا إن الرسائل هنا:
بتتبعت كـ Binary Data
💡 زي ما الأعصاب بتنقل الإشارات بسرعة وكفاءة، Binary Messenger بينقل البيانات بين Flutter وNative بأسرع شكل ممكن.
خليك فاكر المصصطلح دا كويس علشان هنحتاجه بعد كدا
3️⃣ Flutter Engine يفهم الرسالة
الرسالة توصل لـ Flutter Engine
الـ Engine هنا هو مركز التحكم:
- يفك الرسالة
- يفهم الطلب
- ويقول: تمام، دي رايحة للـ Native side
4️⃣ Native Side ينفّذ الطلب
الرسالة توصل لعالم تاني تمامًا:
- Android (Kotlin , Jave)
- أو iOS (Swift , objective-C)
الـ Native هنا يقول:
يلا نفتح الكاميرا زي يلا نقوم ناكل
ويبدأ ينفّذ العملية فعليًا على الجهاز.
5️⃣ النتيجة ترجع تاني
بعد ما المهمة تخلص:
- الكاميرا تتفتح أو تتقفل
- أو يتاخد Data معين
الـ Native يرجّع النتيجة ترجع بنفس الطريق: Native ➜ Engine ➜ Binary Messenger ➜ Dart
وفي الآخر Dart UI يستلم الرد ويحدّث الشاشة

📌ما هي أنواع من Platform Channels ؟
عندنا 4 انواع و بنستخدم كل نوع علي حسب الحاجة اللي عايزين نعملها
1- Method Channel بيستخدم لما يكون عندك method معينة بتتنفذ وبترجّع نتيجة بعدها مباشرة.
2- Event Channel ده بيكون عبارة عن stream of data، يعني بتعمل عليه listen وبيفضل يبعت تحديثات بشكل مستمر (زي real-time updates).
3- BasicMessageChannel بيستخدم لإرسال رسائل عادية بين Flutter و Native، من غير ما يكون فيها method execution (مجرد messages تبادلية).
4- Engine / Embedder APIs دي APIs خاصة بكل Platform Android / iOS، وبيتم استخدامها على مستوى الـ system integration نفسه يعني دا LowLevel.

🔄 طريقة نقل البيانات بين الـ Platform Channels
ليه بنحتاج نفهم الرسائل؟ المخ مش بيستقبل المعلومات بشكلها الخام… لازم يفسرها الاول .
وده مرتبط بـ: Encoding and Decoding
خلونا نعرف طرق نقل البيانات بين ال Platform channels لاننا هنحتاجها علشان نفهم ازاي الرسايل بتببعت بين Flutter , Native
💡عندنا حاجة اسمها الـ Codec و دا الطريقة اللي البيانات بتتتحول بيها (Encoding/Decoding) قبل ما تتبعت بين Flutter والـ Native code عامل زي المترجم .
عندنا كذا نوع :
1️⃣ StandardMessageCodec
هو الـ codec الافتراضي والأكثر استخدامًا
بيدعم أنواع بيانات زي:
int / double
String
bool
List
Map
💡 بيشتغل اوتوماتيك:
بيعمل encode + decode من غير ما تحتاج تكتب أي تحويلات
2️⃣ BinaryCodec
مخصص للـ raw bytes و أسرع في النقل
بس :
لازم أنت تتعامل مع تحويل البيانات بنفسك
📌 ف بيكون مناسب لما تكون شغال على بيانات binary زي ملفات أو streams
3️⃣ StringCodec
مخصص للنصوص بس
📦 بيستخدم:
UTF-8 encoding
💡 بسيط جدًا ومفيد لو التعامل كله Strings
4️⃣ JSONMessageCodec
مخصص لـ JSON
تستخدمه لما:
يكون عندك data structured (Maps / Objects)
وعايز البيانات تكون Readable وسهلة في debug
📌 كويس مع الـ APIs أو البيانات المعقدة نسبيًا
5️⃣ FirestoreMessageCodec و هو اخر حاجة
دا Codec خاص بـ Firebase Firestore
معمول علشان:
يتعامل بسلاسة مع أنواع البيانات الخاصة بـ Firestore SDK
📌 بيستخدم داخليًا في Firebase integration
امتى بستخدم Platform Channels؟ 🤔
بنستخدم Platform Channels لما نحتاج نوصل لحاجات Flutter مش بيدعمها بشكل مباشر، أو لما نحتاج أداء أعلى باستخدام الكود الـ native.
زي مثلًا:
معالجة الصور (Image Processing)
التشفير (Cryptography)
التعامل مع ملفات كبيرة (Large File Parsing)
تشغيل نماذج الذكاء الاصطناعي (Machine Learning Inference)
وكمان بنستخدمها في الحالات اللي محتاجة تعامل مباشر مع إمكانيات الجهاز، زي:
- الوصول لخصائص الموبايل: الكاميرا، المايكروفون، البطارية…
- دمج مكتبات Native جاهزة: زي بوابات الدفع أو أدوات التحليل
- التعامل مع الهاردوير: زي السنسورز، البلوتوث، أو الـ NFC
- استخدام APIs خاصة بكل Platform: زي Widgets معينة، Animations، أو System Events.

🧩 الـ Platform Embedder
آخر مصطلح محتاجين نكون فاهمينه هو Platform Embedder و دا عامل زي جسم الانسان نفسه
في التطبيقات الـ Native (زي Android و iOS)، النظام بيستخدم الـ widgets الخاصة بيه علشان يرسم الواجهة. لكن Flutter مش كدا هو مش بيعتمد على Widgets النظام، لكنه بيرسم كل حاجة بنفسه باستخدام الـ Engine.
طيب هل كده Flutter شغال لوحده تمامًا؟ 🤔 الإجابة: لأ.
لأن لسه محتاج من نظام التشغيل شوية حاجات أساسية زي:
فتح التطبيق
استقبال الـ touch
التعامل مع الكيبورد
إدارة حالة التطبيق (Lifecycle)
وهنا بييجي دور الـ Platform Embedder
🎯 هو إيه الـ Platform Embedder؟
ببساطة: هو الطبقة اللي بتربط بين Flutter ونظام التشغيل.
يعني هو الوسيط اللي بيسمح لـ Flutter إنه يشتغل جوه Android أو iOS.
⚙️ وظيفته إيه؟
الـ Platform Embedder مسؤول عن:
1️⃣ تشغيل تطبيق Flutter 2️⃣ تشغيل الـ Flutter Engine 3️⃣ إنشاء مساحة للرسم Texture / Surface 4️⃣ استقبال المدخلات Touch / Mouse / Keyboard 5️⃣ إدارة دورة حياة التطبيق (Lifecycle)
ايه اللي بيحصل لما بشغل تطبيق Flutter؟
العملية بتمشي بالشكل ده:

كل طبقة لها دورها، والـ Embedder هو اللي بيربط الدنيا كلها ببعض.
📱 أمثلة حسب النظام
🔹 Android
Flutter بيشتغل داخل:
- Activity
وبيتم عرض الواجهة داخل:
- FlutterView
والـ View ده هو اللي بيعرض الرسومات اللي بيعملها Flutter.
iOS / macOS
Flutter بيشتغل داخل:
- UIViewController iOS
- NSViewController macOS
الفرق بينه وبين Platform Channels
مهم جدًا ما نلخبطش بين الاتنين:
- Platform Embedder مسؤول عن تشغيل Flutter وربطه بالنظام (تشغيل + رسم + inputs)
- Platform Channels مسؤولة عن التواصل بين Flutter والكود الـ Native (إرسال واستقبال بيانات)
يعني ك ملخص كدا
- Flutter Engine = المخ
- Platform Channels = الأعصاب
- Platform Embedder = الجسم
💡 من غير الجسم… المخ مش هيقدر يتفاعل مع العالم ومن غير Embedder… Flutter مش هيقدر يشتغل أصلاً

الخاتمة
في الآخر،Platform Channels مش مجرد وسيلة تخلّي Flutter يتكلم مع الـ Nativeهي الطريقة اللي بتفتحلك باب تستخدم بيه كل إمكانيات Android وiOS من جوه Flutter.
سواء محتاج توصل لـ feature مش مدعومة،أو تحسّن الأداء في عمليات تقيلة،أو تستخدم SDK جاهز غالبًا هتلاقي الحل هنا.
بس… في نقطة مهمة جدًا
مش كل استخدام لـ Platform Channels بيكون آمن.
في حالات كتير، لو استخدمتها بشكل غلط،ممكن تلاقي التطبيق بيهنّج أو حتى الـ UI بيقف تمامًا.
وساعتها علشان ممكن طريقة استخدامها تكون غلط
وده بالظبط اللي هنتكلم عنه في الجزء اللي جاي 👀
تخيل ان كل مرة بنبني فيها نظام تواصل بين Flutter وNative…إحنا بنعيد نفس الفكرة اللي جسمنا بيستخدمها كل يوم علشان يفهم العالم.
المصادر والموارد
لو حابب تشوف Presetation خفيفة هتلاقيها هنا
و تقدر تشوف فيديو بسيط ليه من هنا
و بكدا نكون خلصنا أول حكاية في عالم الـ Channels… استنوا الجزء التاني في حكاية جديدة مع Threads 🔮

💌 Happy Coding & Smooth Apps
Discussion