Flutter / حدود التطبيق غير المتزامنة / الدرس 11
التخزين المحلي وحالات انقطاع الاتصال
صمّم سياسات التخزين المؤقت والمسودات صراحة وميّز البايتات المحفوظة من نجاح العمل المعتمد.
في هذه الصفحة
أهداف الدرس
- سمّ ما تحفظه
- افصل الحداثة عن التوافر
- رمّز غلاف مسودة ذا إصدار
سمّ ما تحفظه
تختلف متطلبات الرد المخزّن مؤقتا والمسودة غير المحفوظة وبيانات الاعتماد والمعاملة المؤكدة. لا ينبغي لدالة save عامة إخفاء هذه الفروق. يمكن غالبا حذف المخزن المؤقت وإعادة بنائه، بينما قد يدمر فقد المسودة عمل المستخدم. وقد تتطلب المعاملة تأكيدا دائما من الخادم وتسوية بعد اكتمال غير مؤكد. حدّد المالك والعمر المتوقع والحساسية وإصدار المخطط وسياسة الحذف لكل سجل محلي. تختلف واجهات الإضافات حسب المنصة والحزمة؛ فاخترها بضماناتها الموثقة لا بافتراض أن نجاح الكتابة يضمن كل صور الديمومة.
افصل الحداثة عن التوافر
قد تكون القيمة المخزنة متاحة لكنها قديمة. احفظ بيانات وصفية تكفي لشرح ذلك، مثل وقت آخر جلب ناجح وإصدار المخطط، دون تقديم الطابع المحلي كدليل حقيقة الخادم. اختر هل تعرض الشاشة المخزن فورا وتحدّثه، أم تشترط ردا حديثا، أم تتيح وضعا صريحا دون اتصال. تعتمد السياسة على عاقبة المعلومات القديمة. لا تتساوى حاجات حداثة كتالوج قراءة وحجز مقعد. وتجنب فترات إعادة أو انتهاء عامة منفصلة عن عقد التطبيق.
رمّز غلاف مسودة ذا إصدار
ينتج المقتطف الأول غلاف JSON صغيرا لمسودة ورشة. يسمح الإصدار لقارئ مستقبلي بمعرفة المخطط المتوقع قبل تفسير الحقول. يبقى العنوان مسودة؛ ولا يثبت ترميزه التحقق أو الإرسال أو التشفير أو الحفظ الدائم على القرص. اجعل الصيغ صريحة كي يفحص الاختبار التوافق. ينبغي لمهايئ التخزين الإنتاجي معالجة فشل الكتابة وحفظ السجل السابق الصحيح حيث تسمح دلالات الاستبدال الموثقة. ولا تحفظ الأسرار في ملف تفضيلات عادي لمجرد قبول الواجهة للنصوص.
import 'dart:convert';
String encodeDraft(String title) => jsonEncode({
'schema': 1,
'title': title,
});
void main() { print(encodeDraft('Maps')); }
{"schema":1,"title":"Maps"}
الناتج نص متسلسل فقط. لا تحدث كتابة في نظام ملفات أو إضافة تفضيلات أو قاعدة بيانات.
ارفض أشكال التخزين غير المتوافقة صراحة
يفحص المقتطف الثاني إصدار الغلاف ونوع العنوان. يعيد الغياب للمسودة غير المتوافقة بدلا من إسقاط عنصر أثناء العرض. ويقرر المستودع المحيط عزل السجل أو ترحيله أو حذفه وهل يحتاج المستخدم إلى رسالة استرداد. يجب أن يحفظ الترحيل المعنى، لا مجرد تغيير اسم مفتاح حتى يتوقف الفشل. احفظ عينتي تخزين معيب وإصدار قديم للاختبارات. وإذا كانت المسودة عملا مهما للمستخدم، فالحذف الصامت أقل ملاءمة عادة من مسار استرداد مرئي.
String? decodeDraft(String source) {
try {
final raw = jsonDecode(source);
if (raw is! Map<String, dynamic> || raw['schema'] != 1) return null;
final title = raw['title'];
return title is String ? title : null;
} on FormatException { return null; }
}
// A schema-1 Maps fixture returns Maps; schema 2 returns null.
The schema-1 fixture returns Maps; the unsupported schema returns null.
يتطلب dart:convert. تشير null إلى تطبيق سياسة الاسترداد لدى المستودع، لا إعلان مسودة فارغة ناجحة.
عامل الكتابات المنتظرة كأوامر غير محسومة
يحتاج طابور أوامر دون اتصال إلى هوية عملية مستقرة وقواعد ترتيب ومعالجة تعارض وتمييز واضح بين المعلق والمؤكد. وحالة الاتصال مجرد مؤشر؛ فقد توجد واجهة شبكة بينما الخدمة غير متاحة. وقد تصل كتابة انتهت مهلتها إلى الخادم فعلا، لذا تحتاج الإعادة إلى عقد تماثل العملية في الخادم أو تسوية. لا تعلن تأكيد الحجز لمجرد وضعه في طابور محلي. اعرض الانتظار بوضوح ودع المستخدم يفهم هل ما زال الإلغاء ممكنا.
اختبر الاسترداد لا الكتابة الناجحة وحدها
استخدم بديلا في الذاكرة لمحاكاة فشل القراءة والبايتات المعيبة والإصدارات غير المدعومة ورفض الكتابة دون قاعدة بيانات جهاز حقيقية. تحقق من حفظ المسودات القابلة للاسترداد وتمييز القديم من الحديث في الواجهة. وللأوامر المنتظرة حاك إعادة بدء بين الإدراج المحلي والتأكيد البعيد وافحص معالجة التكرار. تثبت الاختبارات النقية السياسة، بينما يحتاج حفظ المنصة وإنهاء العملية والتخزين المحمي إلى اختبارات تكامل على الهدف. وثّق الحد ولا تعتبر نجاح تحويل JSON دليلا على العمل الدائم دون اتصال.
الأخطاء الشائعة وإصلاحها
تبدو البيانات القديمة حديثة
- لماذا يحدث؟
- مُثل التوافر والتحديث الناجح بعلم واحد.
- كيف تصلحه؟
- أتح بيانات الحداثة ونتائج التحديث صراحة.
- كيف تتجنب تكراره؟
- اختبر مخزنا قديما مع تحديث فاشل.
لا يفك تحديث التطبيق المسودات المحفوظة
- لماذا يحدث؟
- تغير المخطط دون إصدار أو سياسة استرداد.
- كيف تصلحه؟
- اقرأ غلافا ذا إصدار ورحّل أو استرد عن قصد.
- كيف تتجنب تكراره؟
- احفظ عينات المخططات السابقة المدعومة.
تنشئ الإعادة عمليات بعيدة مكررة
- لماذا يحدث؟
- عومل الاكتمال غير المؤكد كفشل مؤكد.
- كيف تصلحه؟
- استخدم هوية العملية وعقد تماثل العملية أو التسوية لدى الخدمة المعتمدة.
- كيف تتجنب تكراره؟
- اختبر فقد الردود منفصلا عن الكتابات المرفوضة.
اختبر فهمك
1. هل يثبت نجاح encodeDraft بقاء المسودة بعد إنهاء العملية؟
اعرض الحل المشروح
لا. ينشئ نصا فقط. تعتمد الديمومة على مهايئ التخزين ودلالات اكتمال الكتابة وسلوك المنصة والتعافي. اختبر التسلسل منفصلا عن حفظ الهدف الفعلي وحدّد الضمان الذي يثبته كل فحص.
2. كيف توصف حجوزات المقاعد دون اتصال قبل تأكيد الخادم؟
اعرض الحل المشروح
استخدم تسمية معلق أو في الطابور مع حدود الإلغاء اللازمة. احفظ معرّف عملية للتسوية. قد يتغير التوافر قبل تقييم الخادم للأمر، لذلك لا يمثل الإدراج المحلي تأكيدا ولا يجوز أن يَعِد بمقعد.
أهم ما تعلمته
- سمّ ما تحفظه
- اختبر الاسترداد لا الكتابة الناجحة وحدها