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

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

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

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

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

تعریف کردن کلاس‌های 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 = PreferencesSerializer,
        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 APIs ارائه دهید:

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

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