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 DataStore i oficjalnych 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 DataStoreandroidx.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"
}
)