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

کتابخانه DataStore داده‌ها را به صورت غیرهمزمان، مداوم و تراکنشی ذخیره می‌کند و بر برخی از معایب SharedPreferences غلبه می‌کند. این صفحه بر ایجاد DataStore در پروژه‌های Kotlin Multiplatform (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، می‌توانید مسیر را از 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 (دسکتاپ)، با استفاده از 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
    }
)