הגדרה של DataStore ל-KMP

ספריית DataStore מאחסנת נתונים באופן אסינכרוני, עקבי וטרנזקציונלי, וכך מתגברות על חלק מהחסרונות של SharedPreferences. בדף הזה נסביר איך ליצור DataStore בפרויקטים של Kotlin Multiplatform ‏ (KMP). למידע נוסף על DataStore, אפשר לעיין במסמכי התיעוד העיקריים של DataStore ובדוגמאות הרשמיות.

הגדרת יחסי תלות

כדי להגדיר את DataStore בפרויקט KMP, מוסיפים את יחסי התלות של הארטיפקטים בקובץ build.gradle.kts של המודול:

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

הגדרת המחלקות של 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"

Android

כדי ליצור את מופע DataStore ב-Android, צריך 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 (במחשב), צריך לספק נתיב באמצעות ממשקי 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
    }
)