Konfigurowanie DataStore na potrzeby KMP

Biblioteka DataStore przechowuje dane asynchronicznie, spójnie i transakcyjnie, eliminując niektóre wady SharedPreferences. Ta strona dotyczy tworzenia DataStore w projektach Kotlin Multiplatform (KMP). Więcej informacji o DataStore znajdziesz w głównej dokumentacji DataStore.

Konfigurowanie zależności

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

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

Definiowanie klas DataStore

Klasę DataStore możesz zdefiniować za pomocą DataStoreFactory w wspólnym źródle udostępnionego modułu KMP. Umieszczenie tych klas we wspólnych źródłach umożliwia ich udostępnianie na wszystkich platformach docelowych. Możesz używać deklaracji actual i expect, aby tworzyć implementacje na konkretne 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 zbiorach źródeł konkretnej 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(storage: Storage<Preferences>): DataStore<Preferences> =
        DataStoreFactory.create(storage = storage)

internal const val dataStoreFileName = "dice.preferences_pb"

Android

Aby utworzyć instancję DataStore na Androidzie, potrzebujesz Context i ścieżki.

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

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = FileStorage(
        serializer = PreferencesFileSerializer,
        produceFile = { context.filesDir.resolve(dataStoreFileName) }
    )
)

iOS

W iOS ścieżkę możesz pobrać z NSDocumentDirectory:

// shared/src/iosMain/kotlin/createDataStore.ios.kt

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = OkioStorage(
        fileSystem = FileSystem.SYSTEM,
        serializer = PreferencesSerializer,
        producePath = {
            val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
                directory = NSDocumentDirectory,
                inDomain = NSUserDomainMask,
                appropriateForURL = null,
                create = false,
                error = null,
            )
            (requireNotNull(documentDirectory).path + "/$dataStoreFileName").toPath()
        }
    )
)

Sieć

Aby utworzyć instancję DataStore w internecie, możesz użyć WebLocalStorage lub WebSessionStorage:

// shared/src/jsMain/kotlin/createDataStore.web.kt (also works for wasmJsMain)

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = WebLocalStorage(
        serializer = PreferencesSerializer,
        name = dataStoreFileName
    )
)

JVM (komputer)

Aby utworzyć instancję DataStore na JVM (komputer), podaj ścieżkę za pomocą interfejsów API Javy lub Kotlina:

// shared/src/jvmMain/kotlin/createDataStore.desktop.kt

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = FileStorage(
        serializer = PreferencesFileSerializer,
        produceFile = { File(System.getProperty("java.io.tmpdir"), dataStoreFileName) }
    )
)