La libreria DataStore archivia i dati in modo asincrono, coerente e transazionale, superando alcuni degli svantaggi di SharedPreferences. Questa pagina si concentra sulla creazione di DataStore nei progetti Kotlin Multiplatform (KMP). Per maggiori informazioni su DataStore, consulta la documentazione principale di DataStore.
Configura le dipendenze
Per configurare DataStore nel tuo progetto KMP, aggiungi le dipendenze per gli artefatti
nel file build.gradle.kts del tuo modulo:
commonMain.dependencies {
// DataStore library
implementation("androidx.datastore:datastore-core:1.3.0")
// The Preferences DataStore library
implementation("androidx.datastore:datastore-preferences-core:1.3.0")
}
Definisci le classi DataStore
Puoi definire la classe DataStore con DataStoreFactory all'interno dell'origine comune del modulo KMP condiviso. L'inserimento di queste classi in origini comuni consente di condividerle 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 nei set di risorse della piattaforma specifica 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(storage: Storage<Preferences>): DataStore<Preferences> =
DataStoreFactory.create(storage = storage)
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(): DataStore<Preferences> = createDataStore(
storage = FileStorage(
serializer = PreferencesFileSerializer,
produceFile = { context.filesDir.resolve(dataStoreFileName) }
)
)
iOS
Su iOS, puoi recuperare il percorso da NSDocumentDirectory:
// shared/src/iosMain/kotlin/createDataStore.ios.kt
fun createDataStore(): DataStore<Preferences> = createDataStore(
storage = OkioStorage(
fileSystem = FileSystem.SYSTEM,
serializer = PreferencesSerializer,
producePath = {
val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
directory = NSDocumentDirectory,
inDomain = NSUserDomainMask,
appropriateForURL = null,
create = false,
error = null,
)
(requireNotNull(documentDirectory).path + "/$dataStoreFileName").toPath()
}
)
)
Web
Per creare l'istanza DataStore sul web, puoi utilizzare WebLocalStorage o WebSessionStorage:
// shared/src/jsMain/kotlin/createDataStore.web.kt (also works for wasmJsMain)
fun createDataStore(): DataStore<Preferences> = createDataStore(
storage = WebLocalStorage(
serializer = PreferencesSerializer,
name = dataStoreFileName
)
)
JVM (computer)
Per creare l'istanza DataStore su JVM (desktop), fornisci un percorso utilizzando le API Java o Kotlin:
// shared/src/jvmMain/kotlin/createDataStore.desktop.kt
fun createDataStore(): DataStore<Preferences> = createDataStore(
storage = FileStorage(
serializer = PreferencesFileSerializer,
produceFile = { File(System.getProperty("java.io.tmpdir"), dataStoreFileName) }
)
)