DataStore (multiplateforme Kotlin)

La bibliothèque DataStore stocke les données de manière asynchrone, cohérente et transactionnelle, ce qui élimine certains des inconvénients de SharedPreferences. Cette page explique comment créer DataStore dans des projets de multiplateforme Kotlin (KMP). Pour en savoir plus sur DataStore, consultez la documentation principale de DataStore et les exemples officiels.

Configurer des dépendances

DataStore est compatible avec KMP dans les versions 1.1.0 et ultérieures.

Pour configurer DataStore dans votre projet KMP, ajoutez les dépendances des artefacts dans le fichier build.gradle.kts de votre module:

  • androidx.datastore:datastore - Bibliothèque DataStore
  • androidx.datastore:datastore-preferences – Bibliothèque Preferences DataStore

Définir les classes DataStore

Vous pouvez définir la classe DataStore avec DataStoreFactory dans la source commune de votre module KMP partagé. Le fait de placer ces classes dans des sources communes permet de les partager sur toutes les plates-formes cibles. Vous pouvez utiliser les déclarations actual et expect pour créer des implémentations spécifiques à la 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 figurer dans les ensembles de sources de la plate-forme spécifique en raison des différences au niveau des API de système de fichiers.

Classique

// 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

Pour créer l'instance DataStore, vous avez besoin d'un Context ainsi que du chemin d'accès au fichier.

// shared/src/androidMain/kotlin/createDataStore.android.kt

fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
    producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)

iOS

Pour créer l'instance DataStore, vous avez besoin d'une fabrique de base de données et d'un chemin d'accès à la base de données.

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