DataStore (Kotlin Multiplatform)

تخزِّن مكتبة DataStore البيانات بشكل غير متزامن ومتّسق وبطريقة تتعلّق بالمعاملات، ما يحلّ بعض المشاكل في SharedPreferences. تركّز هذه الصفحة على إنشاء DataStore في مشاريع Kotlin Multiplatform (KMP). لمزيد من المعلومات عن DataStore، يُرجى الاطّلاع على المستندات الأساسية لواجهة DataStore وعيّنات رسمية.

إعداد التبعيات

يتيح DataStore استخدام KMP في الإصدار 1.1.0 والإصدارات الأحدث.

لإعداد DataStore في مشروع KMP، أضِف التبعيات للعناصر في ملف build.gradle.kts الخاص بوحدتك:

  • androidx.datastore:datastore - مكتبة DataStore
  • androidx.datastore:datastore-preferences - مكتبة DataStore للإعدادات المفضّلة

تحديد فئات DataStore

يمكنك تحديد فئة DataStore باستخدام DataStoreFactory داخل مصدر المشترَك لمكوّن KMP المشترَك. من خلال وضع هذه الفئات في مصادر مشتركة، يمكن مشاركتها على جميع المنصّات المستهدَفة. يمكنك استخدام بيانَي actual وexpect لإنشاء عمليات تنفيذ خاصة بالنظام الأساسي.

إنشاء مثيل Datastore

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

الإعدادات الشائعة

// shared/src/androidMain/kotlin/createDataStore.kt

/**
 * Gets the singleton DataStore instance, creating it if necessary.
 */
fun createDataStore(producePath: () -> String): DataStore<Preferences> =
        PreferenceDataStoreFactory.createWithPath(
            produceFile = { producePath().toPath() }
        )

internal const val dataStoreFileName = "dice.preferences_pb"

Android

لإنشاء مثيل DataStore، تحتاج إلى Context مع مسار الملف.

// shared/src/androidMain/kotlin/createDataStore.android.kt

fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
    producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)

iOS

لإنشاء مثيل DataStore، تحتاج إلى مصنع DataStore مع مسار DataStore.

// shared/src/iosMain/kotlin/createDataStore.kt

fun createDataStore(): DataStore<Preferences> = createDataStore(
    producePath = {
        val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
            directory = NSDocumentDirectory,
            inDomain = NSUserDomainMask,
            appropriateForURL = null,
            create = false,
            error = null,
        )
        requireNotNull(documentDirectory).path + "/$dataStoreFileName"
    }
)