فهم منصات Flutter Plugin وتنفيذاتها الفعلية، مع استخدام fork أو path dependency بدل تعديل الكاش أو إضافة pluginClass غير موجود.
إعلان المنصة لا ينشئ تنفيذها
إضافة ios إلى platforms داخل pubspec.yaml لا تنقل كود Android إلى Swift ولا توفر SDK غير موجود. احذف الاستدعاء من المنصة غير المدعومة أو وفر تنفيذًا أصليًا مناسبًا أو بديلًا واضحًا للمستخدم. بعض plugins اتحادية وتحتاج حزمة platform implementation معتمدة؛ افحص تبعياتها ووثائقها قبل استنتاج أن المشكلة مجرد تعليق في YAML.
التعديل القابل للتكرار
مجلد pub-cache ناتج تنزيل مشترك وقد يعاد إنشاؤه؛ التعديل داخله لا يصل تلقائيًا لبقية الفريق أو CI. أنشئ fork مثبتًا على commit أو انسخ حزمة برخصتها إلى مسار داخل المستودع واستخدم path dependency. وثق الفرق واختبر بناء المنصتين. تشغيل flutter clean لا يعوض كود native مفقودًا، ولا تجعل نجاح pub get دليلًا على تشغيل الإضافة على الجهاز.
قراءة معلومات الحزمة
افتح صفحة الحزمة ثم اقرأ platforms وملف README وإصداراتها وتبعيات implementation. الحزمة المكتوبة بلغة Dart فقط قد تعمل على منصات عدة دون قسم plugin، بينما حزمة تعتمد SDK دفع أو كاميرا أصلية تحتاج تنفيذًا لكل نظام. افصل دعم البناء عن دعم الوظيفة: قد يسمح المؤلف ببناء iOS مع إرجاع unsupported لميزة معينة. سجّل المنصات التي تحتاجها فعليًا وأقل إصدارات نظام مستهدفة قبل اختيار المكتبة، ثم اقرأ ما إذا كانت الوظيفة تحتاج ترخيصًا أو SDK لا يمكن نقله بين الشركات.
عزل استدعاء الميزة
اجعل طبقة خدمة تعلن القدرة على الميزة قبل أن تضغط الواجهة زر التشغيل، وأعد نتيجة unsupported مفهومة بدل استثناء مبهم. لا تختبر Platform.isAndroid في ملف يستورده الويب دون حماية استيراد؛ الاستيراد نفسه قد يمنع البناء قبل وصول الشرط. استخدم واجهة مشتركة وتنفيذًا ملائمًا أو استيرادات شرطية عندما تحتاج مكتبات نظام مختلفة. أبق زرًا بديلًا أو مسارًا يدويًا إذا كانت العملية مهمة للمستخدم، بدل إخفاء كل الصفحة لأن جهازه ليس المنصة الأولى.
صيانة fork محلي
إذا احتجت تعديل مكتبة احتفظ بنسخة أصلية ومراجعة commit الذي بدأت منه. اجعل الفرق صغيرًا ووثقه وأضف اختبارًا يوضح السبب. في المشروع المستهلك عرّف path أو Git dependency يمكن لفريقك وCI الوصول إليها، لا مسارًا مطلقًا على حاسوبك. اسم الحزمة داخل pubspec يجب أن يطابق اسم الاستيراد المتوقع، وقد تتطلب إضافة منصة تعديل ملفات build وpodspec وإصدار SDK لا YAML وحدها. راجع رخصة الحزمة قبل إعادة توزيعها أو نشر fork عام.
مصفوفة تحقق واقعية
اختبر pub get والتحليل وبناء أصغر تطبيق على كل نظام مطلوب، ثم شغل الميزة نفسها مع النجاح والفشل ورفض الإذن. راجع السجل الأصلي عند حدوث MissingPluginException أو channel-error لأن الرسالة العامة لا تحدد كل الأسباب. بعد التعديل أعد البناء الأصلي بدل الاكتفاء بـHot Reload، وثبت نسخة الحزمة التي نجحت حتى تعيد النتيجة في CI. لا تحذف مجلدات iOS أو Android للمشروع الفعلي لتوليد بديل دون حفظ إعداداته وتوقيعه وموارده؛ المقارنة مع مشروع مؤقت أوضح وأقل إرباكًا.
قرار اختيار بديل
إذا كان SDK الخاص بالخدمة لا يدعم منصة مستهدفة فلا تجعل إعلان الدعم في fork يوهم الفريق بوجوده. قارن البدائل وفق الوظائف الفعلية والرخصة والصيانة وإصدار النظام، وجرب أهم عملية في مشروع صغير. احتفظ بحدود واضحة لطبقة المنصة حتى يمكن تغيير التنفيذ لاحقًا دون نسخ كل شاشة أو منطق بيانات إلى فرع جديد لكل نظام تشغيل.
مراجعة أخيرة للتطبيق
احتفظ بقائمة المنصات المدعومة ضمن README حتى يعرف المستهلك حدود التنفيذ قبل الاعتماد عليه.
مثال الشفرة بعد المراجعة
اقرأ التعليقات ومتطلبات الإعداد قبل النقل إلى مشروعك. أمثلة الواجهات ذات main مستقلة، أما العقود والمقاطع الأصلية وملفات الإعداد فموضح نطاقها داخل المثال.
# app/pubspec.yaml — after creating a maintained local copy:
dependencies:
example_plugin:
path: packages/example_plugin
# example_plugin must have real implementations for its declared platforms.
# Then run in the app directory:
# flutter pub get
# flutter analyze
# flutter testمرجع للتنفيذ
راجع التوثيق الخاص بهذا الموضوع وطابق إعداداته مع إصدار أدوات مشروعك. اختبر السلوك المستهدف وحالة الفشل قبل إدماج المثال في تطبيق منشور.






