محتويات الدورة

Flutter / Dart والعناصر والملكية المحلية / الدرس 1

قيم Dart وبيئة Flutter الواضحة

افصل ضمانات اللغة وإعداد المشروع ومسؤوليات المنصة المستهدفة قبل كتابة شاشة.

وقت القراءة التقريبي: 5 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • سجّل حدود التنفيذ
  • عبّر عن الغياب في النوع
  • اجعل التطبيع دالة نقية

سجّل حدود التنفيذ

تستخدم Flutter لغة Dart لوصف التطبيق، بينما يتولى المحرك وإطار العمل وطبقة الدمج وأدوات المنصة مهام مختلفة. يمكن فهم دالة Dart دون محاكي Android، لكن عنصر Material يحتاج إلى مكتبات Flutter وبيئة تعرض العناصر. ويحتاج تطبيق iOS الموقّع أيضا إلى أدوات Apple المدعومة وإعداد التوقيع. سجّل حزمة SDK التي اختارها المشروع والمنصة وملف قفل الاعتماديات ونمط البناء عند تشخيص السلوك. لا يثبت أمر منسوخ من مشروع آخر توافق هذه الحدود. تعرض الدورة المقتطفات بوصفها أمثلة توضيحية غير منفّذة لأن بيئة التأليف لا تحتوي على Flutter أو Dart.

عبّر عن الغياب في النوع

يجب أن يحمل النوع String غير القابل للقيمة الفارغة نصا، بينما يسمح String? أيضا بالقيمة null. تمنح هذه التفرقة المحلّل معلومات قبل عرض أي عنصر. افحص القيمة المحلية القابلة للغياب واترك تحليل التدفق يضيّق نوعها بدلا من إسكات المحلّل بعامل تأكيد عدم الفراغ. يختلف النص الفارغ عن النص الغائب؛ فقد أدخل المستخدم مسافات فقط، وهي مدخلات موجودة لكنها تحتاج إلى تحقق. حدّد الطبقة التي تزيل المسافات الزائدة والطبقة التي ترفض الغياب. استعمال dynamic لتجاوز خطأ النوع ينقل الغموض إلى وقت التنفيذ.

اجعل التطبيع دالة نقية

يحوّل المقتطف الأول مدخلا اختياريا للعرض إلى تسمية محددة النتائج. يعتمد الناتج على الوسيط وحده، ولا يقرأ وحدة تحكم أو لغة أو اتصالا شبكيا. يسهل بذلك مناقشة الحالات الحدية بمعزل عن اختبار الواجهة. القيمة البديلة قرار يخص المنتج وليست قاعدة عامة للتعامل مع null. فمعرّف الحساب الغائب يحتاج غالبا إلى رفضه بدلا من تحويله بصمت إلى Guest. تمثل الدوال النقية حدودا مفيدة للاختبار، لكن ينبغي أن تحفظ الفروق المهمة في المجال وألا تخفي فشل التحقق خلف نص بديل لطيف.

dart مقتطف توضيحي من Dart أو Flutter؛ يتطلب بيئة SDK المبيّنة.
String displayName(String? raw) {
  final value = raw?.trim();
  return value == null || value.isEmpty ? 'Guest' : value;
}
void main() {
  print(displayName(null));
  print(displayName('  Mira  '));
}
الناتج المتوقع
Guest
Mira

يحافظ الاستدعاء الواعي بالقيمة الفارغة على معنى الغياب، ويعالج الفرع المدخل الغائب أو الفارغ لأغراض العرض. هذه نتائج متوقعة وليست سجلا لتنفيذ SDK.

ميّز المرجع النهائي عن المحتوى الثابت

لا يمكن إسناد قيمة ثانية إلى متغير final، لكن الكائن القابل للتغيير الذي يشير إليه قد يتغير. ينشئ المقتطف الثاني قائمة غير قابلة للتعديل باستخدام List.unmodifiable قبل تمرير القيم عبر حدود الملكية. نسخ المجموعة أو منع تعديلها لا يجمّد تلقائيا كل كائن بداخلها. فإذا احتوت القائمة نماذج قابلة للتغيير وجب تحديد ملكية تلك النماذج أيضا. فضّل كائنات قيم صغيرة ثابتة للمعلومات التي تمرّر إلى العناصر. وسمّ المقادير بوحداتها، مثل priceCents، لأن النوع int وحده لا يميز المال عن عدد العناصر.

dart مقتطف توضيحي من Dart أو Flutter؛ يتطلب بيئة SDK المبيّنة.
void main() {
  final draft = <String>['Map', 'Notes'];
  final published = List<String>.unmodifiable(draft);
  draft.add('Camera');
  print(published.join(', '));
  print(draft.length);
}
الناتج المتوقع
Map, Notes
3

تحفظ المجموعة المنشورة العناصر المنسوخة رغم إضافة عنصر ثالث إلى القائمة الأصلية. تؤدي محاولة تعديل published إلى استثناء أثناء التنفيذ.

اقرأ تشخيص المحلّل قبل أعراض التشغيل

يكشف التحليل الساكن الوصول إلى أعضاء غير مدعوم وإسناد الأنواع غير المتوافقة وكثيرا من أخطاء دورة الحياة قبل تشغيل الجهاز. التحذير دليل على تعبير معين، وليس دعوة لإضافة تحويلات قسرية في كل مكان. تتبّع القيمة من مصدرها واسأل هل العقد المعلن صحيح. لا يصبح حقل JSON موثوقا لمجرد أن النموذج المستقبل يعلن حقلا ذا نوع محدد. تحقّق من شكله الفعلي عند فك الترميز. واحفظ الأمثلة المقصودة لإحداث أخطاء خارج ملفات التطبيق المعتادة كي لا يتحول فشل تعليمي إلى فشل في الإصدار.

استخدم دليلا يناسب الادعاء

يثبت فحص بنية JSON لهذه الدورة اتساق المحتوى، ولا يثبت ترجمة Dart أو التوافق مع الهاتف. ميّز في مشروعك المعزول بين اختبار وحدة للغة واختبار عنصر واختبار تكامل على المنصة. سجّل ما اختبرته وما بقي افتراضا. نجاح عملية حسابية نقية لا يثبت عرض الخطوط أو نوافذ الأذونات أو سلوك إضافة أصلية. وعند تغيير اعتماد أو SDK، راجع قيوده الموثقة قبل نسبة العطل إلى منطق التطبيق. تجعل المدخلات الصغيرة القابلة لإعادة الإنتاج والقيم المتوقعة الواضحة البلاغ قابلا للمعالجة دون بيانات خاصة أو أسرار.

الأخطاء الشائعة وإصلاحها

استعمال قيمة قابلة للغياب كما لو كانت String

لماذا يحدث؟
يسمح العقد بالقيمة null بينما يفترض الاستدعاء وجود النص.
كيف تصلحه؟
افحص الغياب وعالجه قبل استعمال القيمة.
كيف تتجنب تكراره؟
اختبر الغياب والنص الفارغ والمدخل المعتاد كلّا على حدة.

تتغير قائمة final على نحو مفاجئ

لماذا يحدث؟
تحمي final الإسناد ولا تحمي المحتوى القابل للتعديل.
كيف تصلحه؟
حدّد ملكية المجموعة وأتح نسخة ثابتة دفاعية عند الحاجة.
كيف تتجنب تكراره؟
راجع قابلية تعديل النماذج الداخلية أيضا.

اعتبار المقتطف التوضيحي تطبيقا مختبرا

لماذا يحدث؟
لم تُحدّد البيئة وSDK وفحوص المنصة.
كيف تصلحه؟
اذكر متطلبات التنفيذ الناقصة واختبر في بيئة معزولة متوافقة.
كيف تتجنب تكراره؟
أرفق سياق التنفيذ ببلاغات إعادة الإنتاج.

اختبر فهمك

1. هل ينبغي إعادة استخدام displayName لتطبيع معرّف طلب؟

اعرض الحل المشروح

لا. إن Guest بديل للعرض وقد يخترع معرّفا يبدو صحيحا. ينبغي لمحلّل مستقل رفض الغياب والتحقق من صيغة المعرّف وإرجاع نجاح أو فشل صريح. لا تعِد استخدام العمليات إلا حين تتفق عقودها في المجال.

2. كيف يمكن لقائمة غير قابلة للتعديل أن تكشف حالة قابلة للتغيير؟

اعرض الحل المشروح

تحمى عضوية القائمة، لكن أحد عناصرها قد يشير إلى كائن قابل للتغيير ومشترك في موضع آخر. استخدم عناصر ثابتة أو انسخ القيم الداخلية اللازمة. تحقّق من محاولات استبدال عناصر القائمة ومن تعديل عنصر تملكه جهة أخرى.

أهم ما تعلمته

  • سجّل حدود التنفيذ
  • استخدم دليلا يناسب الادعاء

المراجع الرسمية