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 maggiori informazioni su DataStore, consulta la documentazione principale di DataStore e i sample ufficiali.
Configura le dipendenze
Per configurare DataStore nel progetto KMP, aggiungi le dipendenze per gli elementi nel file build.gradle.kts
del modulo:
commonMain.dependencies {
// DataStore library
implementation("androidx.datastore:datastore:1.1.7")
// The Preferences DataStore library
implementation("androidx.datastore:datastore-preferences:1.1.7")
}
Definisci le classi DataStore
Puoi definire la classe DataStore
con DataStoreFactory
all'interno del codice fonte comune del tuo modulo KMP condiviso. Inserire questi tipi di classi in origini comuni consente di condividerli su tutte le piattaforme di destinazione. Puoi utilizzare le 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/commonMain/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
su Android, devi avere un Context
insieme al percorso.
// shared/src/androidMain/kotlin/createDataStore.android.kt
fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)
iOS
Su iOS, puoi recuperare il percorso dal NSDocumentDirectory
:
// shared/src/iosMain/kotlin/createDataStore.ios.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"
}
)
JVM (computer)
Per creare l'istanza DataStore
su JVM (computer), fornisci un percorso utilizzando le API Java o Kotlin:
// shared/src/jvmMain/kotlin/createDataStore.desktop.kt
fun createDataStore(): DataStore<Preferences> = createDataStore(
producePath = {
val file = File(System.getProperty("java.io.tmpdir"), dataStoreFileName)
file.absolutePath
}
)