تخزِّن مكتبة DataStore البيانات بشكل غير متزامن ومتّسق وبطريقة تتعلّق بالمعاملات، ما يحلّ بعض المشاكل في SharedPreferences. تركّز هذه الصفحة على إنشاء DataStore في مشاريع Kotlin Multiplatform (KMP). لمزيد من المعلومات عن DataStore، يُرجى الاطّلاع على المستندات الأساسية لواجهة DataStore وعيّنات رسمية.
إعداد التبعيات
يتيح DataStore استخدام KMP في الإصدار 1.1.0 والإصدارات الأحدث.
لإعداد DataStore في مشروع KMP، أضِف التبعيات للعناصر
في ملف build.gradle.kts
الخاص بوحدتك:
androidx.datastore:datastore
- مكتبة DataStoreandroidx.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"
}
)