Biblioteka DataStore przechowuje dane asynchronicznie, w spójny i transakcyjny sposób, przezwyciężając pewne wady elementu SharedPreferences. Ta strona służy do tworzenia DataStore w projektach Kotlin Multiplatform (KMP). Więcej informacji o DataStore znajdziesz w podstawowej dokumentacji DataStore i w oficjalnych przykładach.
Konfigurowanie zależności
DataStore obsługuje KMP w wersjach 1.1.0 i nowszych.
Aby skonfigurować DataStore w projekcie KMP, dodaj zależności artefaktów w pliku build.gradle.kts
modułu:
androidx.datastore:datastore
– biblioteka DataStoreandroidx.datastore:datastore-preferences
– biblioteka preferencji DataStore
Zdefiniuj klasy DataStore
Możesz zdefiniować klasę DataStore
za pomocą elementu DataStoreFactory
wewnątrz wspólnego źródła udostępnionego modułu KMP. Umieszczenie tych klas we wspólnych źródłach
umożliwia ich udostępnianie na wszystkich platformach docelowych. Do tworzenia implementacji na poszczególnych platformach możesz używać deklaracji actual
i expect
.
Tworzenie instancji DataStore
Musisz określić sposób tworzenia instancji obiektu DataStore na każdej platformie. Jest to jedyna część interfejsu API, która musi znajdować się w zestawach źródłowych platform z powodu różnic między interfejsami 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
, potrzebujesz Context
wraz ze ścieżką 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, musisz mieć fabrykę bazy danych wraz ze ścieżką bazy danych.
// 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"
}
)