Datastore (multipiattaforma Kotlin)

La libreria DataStore archivia i dati in modo asincrono, coerente e transazionale, superando alcuni svantaggi di SharedPreferences. Questa pagina è incentrata sulla creazione di DataStore nei progetti Kotlin Multiplatform (KMP). Per maggiori informazioni su DataStore, consulta la documentazione principale per DataStore e gli esempi ufficiali.

Configurazione delle dipendenze

DataStore supporta KMP nelle versioni 1.1.0 e successive.

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

  • androidx.datastore:datastore - Libreria DataStore
  • androidx.datastore:datastore-preferences - La raccolta del DataStore preferenze

Definisci le classi DataStore

Puoi definire la classe DataStore con DataStoreFactory all'interno dell'origine comune del modulo KMP condiviso. Se posizioni questi corsi in origini comuni, possono essere condivisi tra tutte le piattaforme di destinazione. Puoi utilizzare le 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 essere inclusa negli specifici set di origini della piattaforma 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, è necessario un Context insieme al percorso del file.

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