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