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

Flutter / واجهات شاملة وأدلة الأهداف / الدرس 17

استئناف دورة الحياة وحدود الثقة

أعد فحص القدرات المتغيرة والتفويض بعد الانقطاع دون اعتبار حالة العميل سلطة معتمدة.

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

أهداف الدرس

  • ظهور التطبيق ليس حقيقة المجال
  • راقب دورة الحياة بمالك محدد النطاق
  • تحقّق من الأمر عند الحد المعتمد

ظهور التطبيق ليس حقيقة المجال

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

راقب دورة الحياة بمالك محدد النطاق

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

dart مقتطف توضيحي من Dart أو Flutter؛ يتطلب بيئة SDK المبيّنة.
late final AppLifecycleListener lifecycle;
@override void initState() {
  super.initState();
  lifecycle = AppLifecycleListener(onResume: refreshCapabilityState);
}
@override void dispose() { lifecycle.dispose(); super.dispose(); }
// refreshCapabilityState reconciles status; it does not replay a save.
الناتج المتوقع
Resuming requests status reconciliation while the owning listener remains active.

توفر State المحيطة refreshCapabilityState. لم يُختبر تسليم أحداث العمر أو انقطاع منصة فعلي هنا.

تحقّق من الأمر عند الحد المعتمد

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

dart مقتطف توضيحي من Dart أو Flutter؛ يتطلب بيئة SDK المبيّنة.
enum ReserveOutcome { confirmed, conflict, denied }
abstract interface class Reservations {
  Future<ReserveOutcome> reserve(String workshopId, int seats);
}
Future<ReserveOutcome> submit(Reservations service, String id, int seats) {
  if (id.isEmpty || seats < 1) throw ArgumentError('Invalid reservation');
  return service.reserve(id, seats);
}
الناتج المتوقع
Local invalid input is rejected; a valid-looking command still receives an authoritative outcome.

لا يوجد تنفيذ خدمة أو حجز حقيقي. يسجل التعداد فئات التطبيق دون ادعاء فرض سياسة الخادم.

عامل السجلات وحزم التطبيق كآثار قابلة للفحص

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

اجعل الخروج انتقال حالة منسقا

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

اختبر الانقطاع وتغير الهوية

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

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

يكرر الاستئناف حفظا سابقا

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

يصل رد الجلسة السابقة للمستخدم التالي

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

يحوي عميل مشوش سرا ذا صلاحيات

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

اختبر فهمك

1. لماذا لا يكفي تعطيل زر Reserve لفرض الصلاحية؟

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

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

2. ما الهوية الإضافية اللازمة إذا بقيت الشاشة أثناء تبديل الحساب؟

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

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

أهم ما تعلمته

  • ظهور التطبيق ليس حقيقة المجال
  • اختبر الانقطاع وتغير الهوية

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