حين تقرر شركة أن تبني تطبيقاً لموظفيها أو لعملائها، يظهر سؤال مبكر: هل نبني تطبيقين منفصلين، واحداً لأجهزة Android وآخر لأجهزة iOS، أم تطبيقاً واحداً يعمل على الاثنين؟
والسؤال ليس تقنياً فقط. فهو يحدد كم فريقاً تحتاج، وكم مرة تُكتب الميزة نفسها، وكم يكلّف كل تعديل بعد الإطلاق. وFlutter أحد الخيارات التي تجيب عنه بتطبيق واحد، ونشرح هنا متى يناسب ومتى لا يناسب.
ما الذي يعنيه كود واحد لنظامين
Flutter إطار لبناء التطبيقات من كود واحد يعمل على Android وiOS، ويدعم أيضاً الويب وأنظمة سطح المكتب. يكتب الفريق الشاشات وقواعد العمل مرة واحدة، ثم يُبنى منها تطبيق لكل نظام يُنشر في متجره.
والأثر المباشر على صاحب القرار ثلاثة أمور:
- الميزة تُكتب وتُختبر مرة واحدة في الجزء الأكبر منها، بدل كتابتها مرتين بلغتين مختلفتين.
- فريق واحد يعرف التطبيق كله، بدل فريقين قد تختلف قراراتهما في التفاصيل.
- سلوك متطابق على النظامين: القواعد نفسها، والتحقق نفسه من الحقول، والرسائل نفسها للمستخدم.
وهذا ينعكس على الصيانة بعد الإطلاق أكثر مما ينعكس على البناء. فكل تصحيح لخطأ، وكل تعديل في قاعدة عمل، يُنفَّذ مرة واحدة ويصل إلى مستخدمي النظامين معاً، بدل أن يتأخر أحدهما عن الآخر.
ومن ناحية الكلفة، لا يعني تطبيق واحد أن الكلفة تنخفض إلى النصف تلقائياً، لكنه يعني أن معظم الجهد لا يتكرر. فالتصميم وقواعد العمل والربط مع الخادم والاختبارات الأساسية تُبنى مرة واحدة، ويبقى الجهد الإضافي محصوراً في ما يخص كل نظام وحده.
لكن «كود واحد» لا يعني «عملاً واحداً» تماماً. فما زال لكل نظام إعدادات نشر ومتطلبات متجر وأذونات خاصة به، ويحتاج التطبيق إلى اختبار على أجهزة من النظامين، لا على أحدهما فقط.
متى يكون Flutter مناسباً
يناسب Flutter معظم تطبيقات الأعمال، لأن ما تحتاجه هذه التطبيقات يقع في صلب ما يقدمه:
- النماذج والقوائم: إدخال الطلبات، وتسجيل الزيارات، وعرض الفواتير والأرصدة، والبحث في الأصناف.
- واجهة متسقة: تبدو الشاشات وتعمل بالطريقة نفسها على النظامين، فيسهل شرحها للموظفين ودعمهم.
- البيانات دون اتصال: يتناول توثيق Flutter الرسمي نمط التطبيق الذي يعمل دون اتصال، معتمداً على قاعدة بيانات محلية تُزامن لاحقاً مع الخادم.
- العربية واتجاه الكتابة: يدعم Flutter عبر مكتبة الترجمة الرسمية لغات كثيرة، ويضبط اتجاه الواجهة من اليمين إلى اليسار أو العكس بحسب اللغة المختارة.
- الربط مع أنظمة الشركة عبر API، كنظام ERP أو نظام المبيعات القائم.
وقد تناولنا في مقال «أنظمة تعمل عند انقطاع الإنترنت: لماذا يهم ذلك في أسواقنا» قرارات المزامنة وحل التعارض. وهذه القرارات لا تتغير باختيار Flutter؛ ما يتغير أنها تُكتب مرة واحدة للنظامين.
الواجهة العربية تحتاج إلى عناية مقصودة
دعم اتجاه الكتابة في الإطار نقطة بداية، لا نهاية. فالواجهة العربية الجيدة تحتاج إلى قرارات مقصودة: أي الأيقونات تنعكس مع الاتجاه وأيها يبقى كما هو، وكيف تظهر الأسماء والرموز اللاتينية داخل نص عربي، وكيف تُعرض الأرقام والتواريخ والعملات.
لذلك نختبر الشاشات بالعربية منذ النموذج الأول، لا بعد اكتمال التطبيق بالإنجليزية ثم ترجمته. فالنص العربي قد يطول أو يقصر عن نظيره الإنجليزي، وقد يكسر تصميماً بُني على افتراض اتجاه واحد.
لنفترض أن شركة توزيع تريد تطبيقاً لمندوبيها: يعرض قائمة العملاء والأصناف، ويسجل الطلبات حتى دون اتصال، ويرسلها إلى نظام الشركة حين يعود الاتصال، وبعض المندوبين يحملون أجهزة Android وبعضهم أجهزة iOS. هذه حالة يناسبها Flutter: شاشات أعمال واضحة، وواجهة عربية، وبيانات محلية، وفريق واحد يدير التطبيق كله.
متى قد يكون التطبيق الأصلي أنسب
التطبيق الأصلي تطبيق يُبنى لكل نظام بأدواته ولغته الخاصة. وقد يكون أنسب في حالات محددة:
- حين يعتمد التطبيق في جوهره على ميزات عميقة في نظام التشغيل، كالتكامل الوثيق مع أجهزة خاصة، أو مهام تعمل في الخلفية بطريقة يفرضها كل نظام بشكل مختلف.
- حين يجب أن تتبع الواجهة أسلوب كل نظام بتفاصيله الدقيقة، وتختلف بين Android وiOS اختلافاً كبيراً.
- حين تكون الميزات الجديدة في نظام التشغيل مطلوبة فور صدورها، قبل أن تتوفر طريقة جاهزة لاستخدامها في Flutter.
- حين يملك فريقك خبرة قائمة في البرمجة الأصلية لكل نظام، وتطبيقات قائمة يصعب إعادة بنائها.
والكلفة هنا واضحة: بناء تطبيقين يعني فريقين أو فريقاً يعمل بلغتين، وكل ميزة تُكتب وتُختبر مرتين، وكل تعديل يحتاج إلى تنسيق كي يصل إلى النظامين في الوقت نفسه. لذلك يستحق هذا الخيار كلفته حين يكون ما يقدمه ضرورياً للتطبيق، لا حين يكون تفضيلاً عاماً.
وحتى في هذه الحالات لا يكون الخيار كل شيء أو لا شيء. فـFlutter يتيح كتابة كود خاص بكل نظام لميزة محددة، بلغة Kotlin أو Java على Android، وبلغة Swift أو Objective-C على iOS، ويتواصل معه التطبيق عبر قنوات اتصال تسمى platform channels. فيبقى معظم التطبيق مشتركاً، ويُكتب الجزء الخاص وحده لكل نظام.
والمهم أن تعرف هذه الأجزاء الخاصة قبل البدء، لا في منتصف المشروع. فكل جزء منها يعني كوداً يُكتب ويُختبر ويُصان مرتين، ويجب أن يدخل في حساب الكلفة من البداية.
أسئلة تطرحها قبل الاختيار
- من سيستخدم التطبيق، وعلى أي أجهزة؟ وهل تملك الشركة الأجهزة أم يستخدم كل شخص جهازه؟
- ما الذي يجب أن يعمل دون اتصال، وما البيانات التي تُحفظ على الجهاز؟
- هل يحتاج التطبيق إلى ميزات خاصة بالجهاز، كالكاميرا لقراءة الباركود أو الموقع أو الطباعة عبر طابعة متصلة؟ وهل لها دعم جاهز في Flutter، أم تحتاج إلى كود خاص بكل نظام؟
- هل الواجهة عربية فقط أم بعدة لغات، ومن اليمين إلى اليسار فقط أم بالاتجاهين؟
- كيف سيتصل التطبيق بأنظمتك القائمة، وهل لديها API جاهزة؟
- من سيصون التطبيق بعد الإطلاق، وما الخبرة الموجودة لدى فريقك؟
الإجابات المكتوبة عن هذه الأسئلة تحوّل النقاش من تفضيلات تقنية إلى متطلبات واضحة، يمكن أن تقارن على أساسها بين الخيارات وكلفتها.
وإذا بقي الشك قائماً بعد الإجابة، فبناء نموذج أولي صغير لشاشة أو شاشتين، يتضمن الميزة الأصعب في التطبيق، يحسم السؤال بكلفة محدودة قبل الالتزام بالمشروع كله.
ولا تنسَ أن التطبيق جزء من نظام أكبر. فقواعد العمل الأساسية، كالأسعار والصلاحيات والاعتمادات، مكانها الخادم لا التطبيق، وهذا يجعل قرار الإطار أقل خطورة مما يبدو، لأن جوهر النظام لا يرتبط به.
دليل قرار سريع
- تطبيق أعمال بنماذج وقوائم وتقارير، لمستخدمين على Android وiOS، بواجهة عربية: Flutter خيار مناسب غالباً.
- تطبيق يعمل في الميدان دون اتصال ويُزامن مع نظام مركزي: Flutter مناسب، بشرط حسم قواعد المزامنة قبل البرمجة.
- تطبيق يحتاج إلى ميزة أو ميزتين خاصتين بالجهاز: Flutter مع كود خاص بكل نظام لتلك الميزات فقط.
- تطبيق يعتمد جوهره على ميزة عميقة في نظام واحد: ابدأ بتقييم التطبيق الأصلي لذلك النظام.
- تطبيق يجب أن تطابق واجهته أسلوب كل نظام بدقة: قارن الخيارين بنموذج أولي صغير قبل القرار.
اختيار Flutter ليس قراراً تقنياً معزولاً، بل قرار يحدد كلفة البناء والصيانة وحجم الفريق طوال عمر التطبيق. وحين تكون حالتك تطبيق أعمال لنظامين بواجهة عربية، فالكود الواحد يعني ميزات تُكتب مرة واحدة وتعديلات تصل إلى الجميع معاً. يمكنك أن تناقش حالتك مع فريق ITS لنحدد معاً إن كان Flutter مناسباً لتطبيقك، وأي أجزائه تحتاج إلى كود خاص بكل نظام.
الخدمة المرتبطةتطبيقات الجوال
