DataStore (multiplateforme Kotlin)

La bibliothèque DataStore stocke les données de manière asynchrone, cohérente et transactionnelle, en éliminant certains inconvénients de SharedPreferences. Cette page se concentre sur la création de DataStore dans les projets Kotlin Multiplatform (KMP). Pour en savoir plus sur DataStore, consultez la documentation principale sur DataStore et les exemples officiels.

Configurer des dépendances

Pour configurer DataStore dans votre projet KMP, ajoutez les dépendances des 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é. En plaçant ces classes dans des sources communes, vous pouvez 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 plate-forme spécifiques en raison des différences entre les API de 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 avec le 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 d'accès à partir du 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 (ordinateur), fournissez 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
    }
)