DataStore (Kotlin multiplataforma)

La biblioteca de DataStore almacena datos de forma asíncrona, coherente y transaccional, lo que resuelve algunos de los inconvenientes de SharedPreferences. Esta se centra en la creación de DataStore en proyectos multiplataforma de Kotlin (KMP). Para obtener más información sobre DataStore, consulta el Documentación principal de DataStore y muestras oficiales.

Configura dependencias

DataStore admite KMP en las versiones 1.1.0 y posteriores.

Para configurar DataStore en tu proyecto de KMP, agrega las dependencias para 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

Cómo definir las clases de DataStore

Puedes definir la clase DataStore con DataStoreFactory dentro del elemento común. fuente de tu módulo KMP compartido. Colocar estas clases en fuentes comunes les permite compartirse en todas las plataformas objetivo. 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 se requiere para estar en 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 Context junto con el 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 bases de datos junto con el la ruta de acceso 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"
    }
)