DataStore (multiplateforme Kotlin)

La bibliothèque DataStore stocke les données de manière asynchrone, cohérente et de manière transactionnelle, en contournant certains des inconvénients de SharedPreferences. Ce se concentre sur la création de DataStore dans les projets multiplateformes Kotlin (KMP). Pour en savoir plus sur DataStore, consultez le la documentation principale pour DataStore et des 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 pour les artefacts dans le fichier build.gradle.kts de votre module:

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

Définir les classes DataStore

Vous pouvez définir la classe DataStore avec DataStoreFactory dans le commun source de votre module KMP partagé. Placer ces classes dans des sources communes permet de les partager entre toutes les plates-formes cibles. Vous pouvez utiliser Déclarations actual et expect à 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 requise pour se trouver sur la plate-forme concernée d'ensembles de sources en raison des différences dans les API des systèmes de fichiers.

Courante

// 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 de 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 ainsi que du chemin d'accès vers 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"
    }
)