Datastore (multipiattaforma Kotlin)

La libreria Datastore archivia i dati in modo asincrono, coerente a livello transazionale, superando alcuni svantaggi di SharedPreferences. Questo è incentrata sulla creazione di un datastore nei progetti Kotlin Multiplatform (KMP). Per ulteriori informazioni su Datastore, vedi documentazione principale per Datastore e campioni ufficiali.

Configurazione delle dipendenze

DataStore supporta KMP nelle versioni 1.1.0 e successive.

Per configurare un datastore nel tuo progetto KMP, aggiungi le dipendenze per gli artefatti nel file build.gradle.kts per il tuo modulo:

  • androidx.datastore:datastore - Libreria Datastore
  • androidx.datastore:datastore-preferences - La libreria del datastore delle preferenze

Definire le classi Datastore

Puoi definire la classe DataStore con DataStoreFactory all'interno del campo sorgente del modulo KMP condiviso. Inserire questi corsi nelle fonti comuni consente di condividerli su tutte le piattaforme di destinazione. Puoi utilizzare la modalità Dichiarazioni actual e expect per creare implementazioni specifiche per piattaforma.

crea l'istanza Datastore

Devi definire come creare un'istanza dell'oggetto Datastore su ogni piattaforma. Questa è l'unica parte dell'API che deve trovarsi nella piattaforma specifica set di origini dati a causa delle differenze nelle API del file system.

Comune

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

Per creare l'istanza DataStore, sono necessari Context e del file YAML.

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

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

iOS

Per creare l'istanza Datastore, è necessaria una fabbrica di database insieme del database.

// 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"
    }
)