DataStore (Kotlin multiplataforma)

La biblioteca de DataStore almacena datos de forma asíncrona, coherente y transaccional, por lo que resuelve algunos de los inconvenientes de SharedPreferences. Esta página se enfoca en la creación de DataStore en proyectos de Kotlin multiplataforma (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 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 orígenes 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 el 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 (computadora de escritorio)

Para crear la instancia de DataStore en JVM (para computadoras), 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
    }
)