KMP āĻāϰ āϜāĻ¨ā§āϝ DataStore āϏ⧇āϟ āφāĻĒ āĻ•āϰ⧁āύ

DataStore āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻļ⧇āϝāĻŧāĻžāϰāĻĄāĻĒā§āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ⧇āϰ āĻ•āĻŋāϛ⧁ āĻ¤ā§āϰ⧁āϟāĻŋ āĻ•āĻžāϟāĻŋāϝāĻŧ⧇ āĻ…āϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāϏāĻ­āĻžāĻŦ⧇, āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻāĻŦāĻ‚ āϞ⧇āύāĻĻ⧇āύāĻ—āϤāĻ­āĻžāĻŦ⧇ āĻĄā§‡āϟāĻž āϏāĻžā§āϚāϝāĻŧ āĻ•āϰ⧇āĨ¤ āĻāχ āĻĒ⧃āĻˇā§āĻ āĻžāϟāĻŋ āϕ⧋āϟāϞāĻŋāύ āĻŽāĻžāĻ˛ā§āϟāĻŋāĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ (KMP) āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋāϤ⧇ āĻĄā§‡āϟāĻžāĻ¸ā§āĻŸā§‹āϰ āϤ⧈āϰāĻŋāϰ āωāĻĒāϰ āĻĻ⧃āĻˇā§āϟāĻŋ āύāĻŋāĻŦāĻĻā§āϧ āĻ•āϰ⧇⧎ DataStore āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ, DataStore āĻāĻŦāĻ‚ āĻ…āĻĢāĻŋāϏāĻŋāϝāĻŧāĻžāϞ āύāĻŽā§āύāĻžāϰ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āĻĻ⧇āϖ⧁āύāĨ¤

āύāĻŋāĻ°ā§āĻ­āϰāϤāĻž āϏ⧇āϟ āφāĻĒ āĻ•āϰ⧁āύ

āφāĻĒāύāĻžāϰ KMP āĻĒā§āϰ⧋āĻœā§‡āĻ•ā§āĻŸā§‡ DataStore āϏ⧇āϟ āφāĻĒ āĻ•āϰāϤ⧇, āφāĻĒāύāĻžāϰ āĻŽāĻĄāĻŋāωāϞ⧇āϰ āϜāĻ¨ā§āϝ 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")
}

āĻĄā§‡āϟāĻžāĻ¸ā§āĻŸā§‹āϰ āĻ•ā§āϞāĻžāϏ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰ⧁āύ

āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āĻ­āĻžāĻ— āĻ•āϰāĻž KMP āĻŽāĻĄāĻŋāωāϞ⧇āϰ āϏāĻžāϧāĻžāϰāĻŖ āĻ‰ā§ŽāϏ⧇āϰ āĻ­āĻŋāϤāϰ⧇ DataStoreFactory āĻĻāĻŋāϝāĻŧ⧇ DataStore āĻ•ā§āϞāĻžāϏ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āϏāĻžāϧāĻžāϰāĻŖ āωāĻ¤ā§āϏāϗ⧁āϞāĻŋāϤ⧇ āĻāχ āĻ•ā§āϞāĻžāϏāϗ⧁āϞāĻŋ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āϤāĻžāĻĻ⧇āϰ āϏāĻŽāĻ¸ā§āϤ āϞāĻ•ā§āĻˇā§āϝ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ āϜ⧁āĻĄāĻŧ⧇ āĻ­āĻžāĻ— āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āϝāĻŧ⧎ āφāĻĒāύāĻŋ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ-āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ actual āĻāĻŦāĻ‚ expect āĻ˜ā§‹āώāĻŖāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āĻĄā§‡āϟāĻžāĻ¸ā§āĻŸā§‹āϰ āωāĻĻāĻžāĻšāϰāĻŖ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽā§‡ āĻĄā§‡āϟāĻžāĻ¸ā§āĻŸā§‹āϰ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟāϟāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϟ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āϤāĻž āφāĻĒāύāĻžāϕ⧇ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāϟāĻŋ 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 (āĻĄā§‡āĻ¸ā§āĻ•āϟāĻĒ)

JVM (āĻĄā§‡āĻ¸ā§āĻ•āϟāĻĒ) āĻ DataStore āωāĻĻāĻžāĻšāϰāĻŖ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇, 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
    }
)