Konfigurowanie DataStore na potrzeby KMP

Biblioteka DataStore przechowuje dane asynchronicznie, spójnie i transakcyjnie, co pozwala uniknąć niektórych wad SharedPreferences. Ta strona zawiera informacje o tworzeniu DataStore w projektach Kotlin Multiplatform (KMP). Więcej informacji o magazynie danych znajdziesz w głównej dokumentacji magazynu danych i w oficjalnych przykładach.

Konfigurowanie zależności

Aby skonfigurować DataStore w projekcie KMP, dodaj zależności artefaktów w pliku build.gradle.kts modułu:

commonMain.dependencies {
  // DataStore library
  implementation("androidx.datastore:datastore:1.1.7")
  // The Preferences DataStore library
  implementation("androidx.datastore:datastore-preferences:1.1.7")
}

Zdefiniuj klasy DataStore

Możesz zdefiniować klasę DataStoreDataStoreFactory w wspólnym źródle udostępnionego modułu KMP. Umieszczenie tych klas we wspólnych źródłach umożliwia udostępnianie ich na wszystkich platformach docelowych. Możesz używać actualexpect deklaracji do tworzenia implementacji specyficznych dla platformy.

Tworzenie instancji DataStore

Musisz określić, jak utworzyć instancję obiektu DataStore na każdej platformie. Jest to jedyna część interfejsu API, która musi znajdować się w określonych zestawach źródeł platformy ze względu na różnice w interfejsach API systemu plików.

Częste

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

Aby utworzyć instancję DataStore na Androidzie, potrzebujesz Context wraz ze ścieżką.

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

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

iOS

W iOS możesz pobrać ścieżkę z 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 (Desktop)

Aby utworzyć instancję DataStore na maszynie JVM (komputer), podaj ścieżkę za pomocą interfejsów API Java lub 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
    }
)
.