DataStore (Kotlin Multiplatform)

Biblioteka DataStore przechowuje dane asynchronicznie, konsekwentnie i transakcyjnie, co eliminuje niektóre wady SharedPreferences. Ta strona skupia się na tworzeniu DataStore w projektach Kotlin Multiplatform (KMP). Więcej informacji o DataStore znajdziesz w głównej dokumentacji DataStoreoficjalnych przykładach.

Konfigurowanie zależności

DataStore obsługuje KMP w wersji 1.1.0 lub nowszej.

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

  • androidx.datastore:datastore – biblioteka DataStore
  • androidx.datastore:datastore-preferences – biblioteka magazynu danych preferencji,

Definiowanie klas DataStore

Klasę DataStore możesz zdefiniować za pomocą funkcji DataStoreFactory w commonsource udostępnionego modułu KMP. Umieszczenie tych klas w powszechnie dostępnych źródłach umożliwia ich udostępnianie na wszystkich platformach docelowych. Za pomocą deklaracji actual i expect możesz tworzyć implementacje specyficzne dla danej platformy.

Tworzenie instancji DataStore

Musisz określić, jak tworzyć instancje obiektu DataStore na każdej platformie. Jest to jedyna część interfejsu API, która musi znajdować się w konkretnych zestawach źródeł platformy z powodu różnic w interfejsach API systemu plików.

Częste

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

Aby utworzyć instancję DataStore, musisz mieć Context oraz ścieżkę do pliku.

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

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

iOS

Aby utworzyć instancję DataStore, potrzebujesz fabryki DataStore oraz ścieżki DataStore.

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