تكرار السؤال: …
الإجابة المختصرة
لأن DataStore آمن تمامًا للـ Threads، ويعتمد على Kotlin Coroutines و Flow، ويتعامل مع الأخطاء بأمان دون حجب الـ UI أو التسبب في أخطاء ANR.
الشرح
كانت SharedPreferences تعتمد على عمليات قراءة وكتابة قد تحجب الـ UI Thread (عبر apply أو commit المتزامن) مما يسبب ANR، بالإضافة لعدم وجود آلية موحدة للإبلاغ عن أخطاء الكتابة على القرص. يوفر DataStore معالجة غير متزامنة بالكامل تضمن التماسك الذري للبيانات ويدعم نمطين: Preferences DataStore و Proto DataStore.
مثال بالكود
// قراءة تدفق الإعدادات بأمان:
val IS_DARK_MODE = booleanPreferencesKey("is_dark_mode")
val isDarkModeFlow: Flow<Boolean> = context.dataStore.data
.map { preferences -> preferences[IS_DARK_MODE] ?: false }
// حفظ الإعداد بشكل غير متزامن:
suspend fun setDarkMode(enabled: Boolean) {
context.dataStore.edit { preferences ->
preferences[IS_DARK_MODE] = enabled
}
}أخطاء شائعة
- محاولة قراءة قيمة DataStore بطريقة متزامنة بحجب الخيط (runBlocking) مما يعيد إنتاج نفس مشاكل SharedPreferences.