کتابخانه DataStore داده ها را به صورت ناهمزمان، پیوسته و به صورت تراکنشی ذخیره می کند و بر برخی از اشکالات SharedPreferences غلبه می کند. این صفحه بر ایجاد DataStore در پروژه های چند پلتفرمی Kotlin (KMP) تمرکز دارد. برای اطلاعات بیشتر در مورد DataStore، به اسناد اولیه برای DataStore و نمونههای رسمی مراجعه کنید.
وابستگی ها را تنظیم کنید
برای راه اندازی DataStore در پروژه KMP خود، وابستگی های مصنوعات را در فایل build.gradle.kts
برای ماژول خود اضافه کنید:
commonMain.dependencies {
// DataStore library
implementation("androidx.datastore:datastore:1.1.7")
// The Preferences DataStore library
implementation("androidx.datastore:datastore-preferences:1.1.7")
}
کلاس های DataStore را تعریف کنید
می توانید کلاس DataStore
با DataStoreFactory
در منبع مشترک ماژول KMP مشترک خود تعریف کنید. قرار دادن این کلاس ها در منابع مشترک به آنها اجازه می دهد تا در تمام پلتفرم های هدف به اشتراک گذاشته شوند. میتوانید از اعلانهای actual
و expect
برای ایجاد پیادهسازیهای خاص پلتفرم استفاده کنید.
نمونه DataStore را ایجاد کنید
شما باید نحوه نمونه سازی آبجکت DataStore را در هر پلتفرم تعریف کنید. این تنها بخشی از API است که به دلیل تفاوت در API های سیستم فایل، باید در مجموعه های منبع پلتفرم خاص باشد.
مشترک
// shared/src/commonMain/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"
اندروید
برای ایجاد نمونه DataStore
در اندروید، به یک Context
به همراه مسیر نیاز دارید.
// shared/src/androidMain/kotlin/createDataStore.android.kt
fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)
iOS
در iOS، می توانید مسیر را از NSDocumentDirectory
بازیابی کنید:
// shared/src/iosMain/kotlin/createDataStore.ios.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"
}
)
JVM (رومیزی)
برای ایجاد نمونه DataStore
در JVM (Desktop)، یک مسیر با استفاده از Java یا Kotlin API ارائه کنید:
// shared/src/jvmMain/kotlin/createDataStore.desktop.kt
fun createDataStore(): DataStore<Preferences> = createDataStore(
producePath = {
val file = File(System.getProperty("java.io.tmpdir"), dataStoreFileName)
file.absolutePath
}
)