Flutter / حدود التطبيق غير المتزامنة / الدرس 10
التنقل ونتائج المسارات
امنح المسارات مدخلات ونتائج صريحة وميّز انتقالات المكدس المحلية من حالة التطبيق المرتبطة بالعنوان.
في هذه الصفحة
أهداف الدرس
- المسار حد من حدود التطبيق
- اختر نموذج تنقل يناسب التطبيق
- استقبل نتيجة محلية محددة النوع
المسار حد من حدود التطبيق
يُدخل المسار عمرا للتفاعل وهوية مدخل غالبا. يخفي تمرير كائن شاشة قابل للتعديل كاملا الاعتماديات وقد يحتفظ ببيانات متقادمة. فضّل معرّفا مستقرا أو عقد مدخل صغيرا ثابتا، ودع المالك المناسب يحل البيانات الحالية. ميّز فتح التفاصيل من تفويض الوصول للسجل؛ فظهور التنقل لا يفرض الصلاحية. وقد يتجاوز الرابط العميق الشاشة التي توفر المدخلات عادة، لذا تحقق من المعرّفات المفقودة والمعيبة وغير المتاحة عند حد المسار.
اختر نموذج تنقل يناسب التطبيق
يدير Navigator مكدسا من المسارات ويناسب تفاعلات الفتح والعودة المحلية. وقد تحتاج التطبيقات ذات عناوين المتصفح والروابط العميقة والتنقل المتداخل واستعادة الحالة إلى تكامل مبني على Router مع تحليل مسار وسياسة مكدس صريحة. يمكن لحزمة توجيه تنسيق ذلك، لكن قواعد توافقها وعمرها تحتاج إلى مراجعة. لا تفترض أن كل push أصلي يعطي تلقائيا سجل المتصفح المطلوب. دوّن سلوك الرجوع وإعادة التحميل والدخول المباشر والعنوان المجهول قبل اختيار التجريد أو إضافة استثناءات للأزرار.
استقبل نتيجة محلية محددة النوع
يفتح المقتطف الأول اختيارا محليا وينتظر نتيجته الاختيارية من النوع String. يمثل null الإلغاء، فلا يستبدل الاختيار الحالي. يحمي فحص mounted المستدعي إذا اختفى مالكه أثناء فتح الاختيار. يفترض أن تعيد الوجهة أحد معرّفاتها المسموحة، لكن على مالك المجال التحقق من المعرّف قبل أمر ذي أثر. يناسب النمط تفاعلا محليا صغيرا ولا يثبت تحليل الروابط العميقة أو حالة عنوان مستمرة.
Future<void> chooseWorkshop() async {
final id = await Navigator.of(context).push<String>(
MaterialPageRoute<String>(builder: (_) => const WorkshopChooser()),
);
if (!mounted || id == null) return;
setState(() { selectedId = id; });
}
// WorkshopChooser returns a choice with:
// Navigator.of(context).pop<String>('w-7');
Choosing w-7 updates selectedId; cancelling leaves the old selection unchanged.
تعرّف State المحيطة selectedId ويوفر التطبيق WorkshopChooser. لم يُفتح أي مسار في بيئة التأليف.
حلّل هوية المسار باستقلال
يستخرج المقتطف الثاني معرّف ورشة واحدا من URI. يقبل شكل المسار المختار فقط وصيغة ضيقة لمعرّف مصطنع، ولا يعامل نص المسار الاعتباطي كمفتاح بيانات. قد يعرّف التطبيق مخططا أغنى، لكن عليه فصل التحليل عن جلب البيانات وفحص الصلاحيات. قرّر معالجة المحارف المرمزة والشرطة الأخيرة ووسائط الاستعلام والإصدارات غير المدعومة. فشل التحليل أفضل من اختراع سجل افتراضي يرسل المستخدم إلى وجهة مقنعة لكنها خاطئة.
String? workshopId(Uri uri) {
final parts = uri.pathSegments;
if (parts.length != 2 || parts[0] != 'workshops') return null;
return RegExp(r'^w-[0-9]+$').hasMatch(parts[1]) ? parts[1] : null;
}
void main() {
print(workshopId(Uri.parse('/workshops/w-7')));
print(workshopId(Uri.parse('/workshops/unknown')));
}
w-7
null
يثبت المحلّل صياغة المسار فقط، ولا يثبت وجود السجل أو سماح الوصول للمستخدم الحالي.
افصل عمر البيانات عن عمر المسار
ينبغي لإغلاق الشاشة تحرير وحدات التحكم والمستمعين المحليين، لكنه لا يلزم بمحو البيانات المشتركة. وفي المقابل لا ينبغي لبقاء المستودع أن يحتفظ بسياق كل شاشة قديمة. يمكن لنتيجة المسار طلب تحديث أو تقديم قيمة صغيرة مؤكدة بدلا من نقل نموذج عرض قابل للتعديل كاملا عبر المكدس. وعند وجود عمل غير محفوظ حدّد سياسة مغادرة واضحة بواجهات التنقل الحالية التي يدعمها المشروع. اختبر زر الإلغاء والرجوع في النظام أو المتصفح، فالمستخدم لا يغادر دائما بزرّك.
تحقّق من مسارات الدخول والخروج
تشمل مصفوفة اختبار التنقل الفتح المعتاد والإلغاء والاختيار والدخول المباشر والمدخل المجهول والبيانات غير المتاحة وفشل الصلاحية. افحص أن الرجوع يعيد موضعا مفهوما دون تكرار الشاشات. وفي الويب اختبر إعادة التحميل وسجل العناوين داخل بيئة التوجيه الفعلية؛ فلا يثبت اختبار URI نقي تكامل المتصفح. وينبغي لتغير المسار حفظ تركيز وإعلانات مناسبة كي يدرك مستخدم التقنية المساعدة تغير السياق. احصر ادعاءات السلوك الخاص بالمنصة في الهدف والبيئة المختبرين فعلا.
الأخطاء الشائعة وإصلاحها
يمحو إلغاء الاختيار القيمة السابقة
- لماذا يحدث؟
- عوملت نتيجة null الاختيارية كقيمة مختارة جديدة.
- كيف تصلحه؟
- عالج الإلغاء قبل اعتماد النتيجة.
- كيف تتجنب تكراره؟
- اختبر الرجوع والإلغاء الصريح منفصلين.
يفتح رابط عميق سجلا افتراضيا خاطئا
- لماذا يحدث؟
- تحول مدخل المسار المعيب بصمت إلى معرّف اعتباطي.
- كيف تصلحه؟
- اعرض حالة مسار معيب أو مفقود واضحة.
- كيف تتجنب تكراره؟
- اختبر أشكال المسار المعيبة وغير المدعومة.
يُعتبر معرّف المسار تفويضا
- لماذا يحدث؟
- اختلط التحليل بضبط الوصول.
- كيف تصلحه؟
- افحص الصلاحية عند حد البيانات أو الأمر المعتمد.
- كيف تتجنب تكراره؟
- اختبر الدخول المباشر دون المرور بالقائمة المعتادة.
اختبر فهمك
1. هل يستقبل مسار التفاصيل فهرس قائمة متغيرا أم معرّف سجل مستقرا؟
اعرض الحل المشروح
استخدم المعرّف المستقر. قد تعيد القائمة ترتيبها أو تتحدث أثناء فتح التفاصيل. حل المعرّف لدى مالك البيانات واعرض عدم التوافر إذا اختفى. يظل المسار بذلك مفهوما بعيدا عن لقطة قائمة واحدة.
2. ما الدليل الإضافي اللازم قبل ادعاء دعم محلّل URI للروابط العميقة في المتصفح؟
اعرض الحل المشروح
ادمجه ببيئة Router المختارة وتحقق من الدخول بعنوان مباشر وإعادة التحميل والمسارات المجهولة وسجل الرجوع والتقدم على الهدف. يتعرف المحلّل النقي شكل النص فقط؛ فإعداد توجيه الخادم وتنقل المتصفح حدان مستقلان.
أهم ما تعلمته
- المسار حد من حدود التطبيق
- تحقّق من مسارات الدخول والخروج