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

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

النماذج والتحقق والتركيز

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

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

أهداف الدرس

  • عامل التحرير كحالة مستقلة
  • اجعل التحقق يعيد سببا
  • استخرج قاعدة تحقق نقية

عامل التحرير كحالة مستقلة

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

اجعل التحقق يعيد سببا

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

استخرج قاعدة تحقق نقية

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

dart مقتطف توضيحي من Dart أو Flutter؛ يتطلب بيئة SDK المبيّنة.
String? validateName(String? raw) {
  final value = raw?.trim() ?? '';
  if (value.isEmpty) return 'Enter a workshop name';
  if (value.length < 2) return 'Use at least two characters';
  return null;
}
void main() {
  print(validateName(' '));
  print(validateName('A'));
  print(validateName(' Maps '));
}
الناتج المتوقع
Enter a workshop name
Use at least two characters
null

تعني قيمة النجاح null عدم وجود خطأ تحقق، ولا تعني أن التسمية المقبولة نفسها null.

احفظ مفتاح النموذج مستقرا

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

dart مقتطف توضيحي من Dart أو Flutter؛ يتطلب بيئة SDK المبيّنة.
final formKey = GlobalKey<FormState>();
final nameController = TextEditingController();
String? preview;
void previewDraft() {
  if (!(formKey.currentState?.validate() ?? false)) return;
  setState(() { preview = nameController.text.trim(); });
}
// In build: Form(key: formKey, child: TextFormField(
//   controller: nameController, validator: validateName))
// The owning State disposes nameController.
الناتج المتوقع
A valid Maps draft becomes preview Maps; invalid input leaves the preview unchanged.

هذا مقتطف داخل State مع حذف هيكل العنصر المحيط. ويُعامل غياب FormState كتحقق غير ناجح.

خطّط لسلوك لوحة المفاتيح والتركيز

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

اربط أخطاء الخدمة مع حفظ العمل المحلي

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

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

تختفي الأخطاء وتُصفّر المسودات أثناء البناء

لماذا يحدث؟
يُنشأ مفتاح نموذج أو وحدة تحكم جديدة داخل build.
كيف تصلحه؟
احفظها لدى مالك دورة الحياة وحرّر وحدات التحكم المملوكة.
كيف تتجنب تكراره؟
أعد بناء الأب أثناء ظهور خطأ تحقق.

تصل مدخلات غير رقمية رغم لوحة المفاتيح الرقمية

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

يمحو فشل الخادم عملا مفيدا

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

اختبر فهمك

1. كيف يقبل حقل المقاعد مسودة 04 وينشئ قيمة مجال؟

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

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

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

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

قد يتكرر التحقق ويتوقع نتيجة خطأ فورية. يحتاج فحص التوافر البعيد إلى حالة غير متزامنة مستقلة وقد يتقادم قبل الحفظ. أبق التحقق المحلي نقيا ودع الحفظ المعتمد يفرض قواعد الحجز.

أهم ما تعلمته

  • عامل التحرير كحالة مستقلة
  • اربط أخطاء الخدمة مع حفظ العمل المحلي

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