Configura DataStore para KMP

La biblioteca de DataStore almacena datos de forma asíncrona, coherente y transaccional, por lo que resuelve algunos de los inconvenientes de SharedPreferences. En esta página, se explica cómo crear DataStore en proyectos de Kotlin Multiplatform (KMP). Para obtener más información sobre DataStore, consulta la documentación principal de DataStore y los ejemplos oficiales.

Configura dependencias

Para configurar DataStore en tu proyecto de KMP, agrega las dependencias de los artefactos en el archivo build.gradle.kts de tu módulo:

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

Define las clases de DataStore

Puedes definir la clase DataStore con DataStoreFactory dentro de la fuente común de tu módulo KMP compartido. Colocar estas clases en fuentes comunes permite que se compartan en todas las plataformas de destino. Puedes usar las declaraciones actual y expect para crear implementaciones específicas de la plataforma.

Crea la instancia de DataStore

Debes definir cómo crear una instancia del objeto DataStore en cada plataforma. Esta es la única parte de la API que debe estar en los conjuntos de fuentes de la plataforma específica debido a las diferencias en las APIs del sistema de archivos.

Común

// 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

Para crear la instancia de DataStore en Android, necesitas un Context junto con la ruta de acceso.

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

fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
    producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)

iOS

En iOS, puedes recuperar la ruta de acceso desde 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 (computadoras)

Para crear la instancia de DataStore en la JVM (escritorio), proporciona una ruta de acceso con las APIs de Java o Kotlin:

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

fun createDataStore(): DataStore<Preferences> = createDataStore(
    producePath = {
      val file = File(System.getProperty("java.io.tmpdir"), dataStoreFileName)
      file.absolutePath
    }
)