La bibliothèque DataStore stocke les données de manière asynchrone, cohérente et transactionnelle, ce qui permet de pallier certains inconvénients de SharedPreferences. Cette page explique comment créer DataStore dans des projets Kotlin Multiplatform (KMP). Pour en savoir plus sur DataStore, consultez la documentation principale de DataStore et les exemples officiels.
Configurer des dépendances
Pour configurer DataStore dans votre projet KMP, ajoutez les dépendances pour les artefacts dans le fichier build.gradle.kts de votre module :
commonMain.dependencies {
// DataStore library
implementation("androidx.datastore:datastore:1.1.7")
// The Preferences DataStore library
implementation("androidx.datastore:datastore-preferences:1.1.7")
}
Définir les classes DataStore
Vous pouvez définir la classe DataStore avec DataStoreFactory dans la source commune de votre module KMP partagé. Placer ces classes dans des sources communes leur permet d'être partagées sur toutes les plates-formes cibles. Vous pouvez utiliser les déclarations actual et expect pour créer des implémentations spécifiques à une plate-forme.
Créer l'instance DataStore
Vous devez définir comment instancier l'objet DataStore sur chaque plate-forme. Il s'agit de la seule partie de l'API qui doit se trouver dans les ensembles de sources de plate-forme spécifiques en raison des différences entre les API du système de fichiers.
Courante
// 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
Pour créer l'instance DataStore sur Android, vous avez besoin d'un Context ainsi que du chemin d'accès.
// shared/src/androidMain/kotlin/createDataStore.android.kt
fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)
iOS
Sur iOS, vous pouvez récupérer le chemin à partir de 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 (ordinateur)
Pour créer l'instance DataStore sur JVM (Desktop), indiquez un chemin d'accès à l'aide des API Java ou 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
}
)