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 multiplataforma de Kotlin (KMP). Para obtener más información sobre DataStore, consulta la documentación principal de DataStore y las muestras oficiales.

Configura dependencias

DataStore es compatible con KMP en las versiones 1.1.0 y posteriores.

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

  • androidx.datastore:datastore: Biblioteca de DataStore
  • androidx.datastore:datastore-preferences: La biblioteca de Preferences DataStore

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/androidMain/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 DataStore, necesitas un elemento Context junto con la ruta de acceso al archivo.

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

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

iOS

Para crear la instancia de DataStore, necesitas una fábrica de base de datos junto con la ruta de la base de datos.

// shared/src/iosMain/kotlin/createDataStore.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"
    }
)