Datastore (multipiattaforma Kotlin)

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

Configurazione delle dipendenze

DataStore supporta KMP nelle versioni 1.1.0 e successive.

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

  • androidx.datastore:datastore - Libreria DataStore
  • androidx.datastore:datastore-preferences - La raccolta Preferences DataStore

Definisci le classi DataStore

Puoi definire la classe DataStore con DataStoreFactory all'interno del codice fonte comune del tuo modulo KMP condiviso. Se inserisci questi tipi di classi in origini comuni, puoi condividerli su tutte le piattaforme di destinazione. Puoi utilizzare dichiarazioni actual e expect per creare implementazioni specifiche per la 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 presente negli specifici set di codice sorgente 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, devi avere 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, devi disporre di una fabbrica DataStore e del percorso DataStore.

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