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ę DataStore
z DataStoreFactory
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ć actual
i expect
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
}
)