راه‌اندازی DataStore برای KMP

کتابخانه DataStore داده‌ها را به‌صورت ناهمگام، سازگار، و تراکنشی ذخیره می‌کند و بر برخی‌از معایب SharedPreferences غلبه می‌کند. این صفحه بر ایجاد DataStore در پروژه‌های Kotlin Multiplatform (KMP) تمرکز دارد. برای کسب اطلاعات بیشتر درباره DataStore، به اسناد اصلی DataStore مراجعه کنید.

راه‌اندازی وابستگی‌ها

برای راه‌اندازی DataStore در پروژه KMP، وابستگی‌های مصنوعات را در فایل build.gradle.kts برای واحدتان اضافه کنید:

commonMain.dependencies {
  // DataStore library
  implementation("androidx.datastore:datastore-core:1.3.0")
  // The Preferences DataStore library
  implementation("androidx.datastore:datastore-preferences-core:1.3.0")
}

تعریف کردن کلاس‌های DataStore

می‌توانید کلاس DataStore را با DataStoreFactory در منبع مشترک مدول KMP هم‌رسانی‌شده‌تان تعریف کنید. قرار دادن این کلاس‌ها در منابع مشترک امکان هم‌رسانی آن‌ها را در همه پلاتفرم‌های هدف فراهم می‌کند. می‌توانید از اعلان‌های actual و expect برای ایجاد پیاده‌سازی‌های مختص پلاتفرم استفاده کنید.

ایجاد نمونه DataStore

باید نحوه نمونه‌سازی شیء DataStore را در هر پلاتفرم تعریف کنید. این تنها بخشی از میانای برنامه‌سازی کاربردی است که به‌دلیل تفاوت‌های موجود در میاناهای برنامه‌سازی کاربردی سیستم فایل، باید در مجموعه‌های منبع پلاتفرم خاص باشد.

متداول

// shared/src/commonMain/kotlin/createDataStore.kt

/**
 *   Gets the singleton DataStore instance, creating it if necessary.
 */
fun createDataStore(storage: Storage<Preferences>): DataStore<Preferences> =
        DataStoreFactory.create(storage = storage)

internal const val dataStoreFileName = "dice.preferences_pb"

Android

برای ایجاد نمونه DataStore در Android، به Context و مسیر نیاز دارید.

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

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = FileStorage(
        serializer = PreferencesFileSerializer,
        produceFile = { context.filesDir.resolve(dataStoreFileName) }
    )
)

iOS

در iOS، می‌توانید مسیر را از NSDocumentDirectory بازیابی کنید:

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

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

وب

برای ایجاد نمونه DataStore در وب، می‌توانید از WebLocalStorage یا WebSessionStorage استفاده کنید:

// shared/src/jsMain/kotlin/createDataStore.web.kt (also works for wasmJsMain)

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = WebLocalStorage(
        serializer = PreferencesSerializer,
        name = dataStoreFileName
    )
)

JVM (رایانه)

برای ایجاد نمونه DataStore در JVM (رایانه)، بااستفاده از میاناهای برنامه‌سازی کاربردی Java یا Kotlin، مسیری ارائه دهید:

// shared/src/jvmMain/kotlin/createDataStore.desktop.kt

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = FileStorage(
        serializer = PreferencesFileSerializer,
        produceFile = { File(System.getProperty("java.io.tmpdir"), dataStoreFileName) }
    )
)