Library DataStore menyimpan data secara asinkron, konsisten, dan transaksional, yang mengatasi beberapa kelemahan SharedPreferences. Halaman ini berfokus pada pembuatan DataStore dalam project Kotlin Multiplatform (KMP). Untuk informasi selengkapnya tentang DataStore, lihat dokumentasi utama untuk DataStore dan contoh resmi.
Menyiapkan dependensi
Untuk menyiapkan DataStore di project KMP, tambahkan dependensi untuk artefak
dalam file build.gradle.kts untuk modul Anda:
commonMain.dependencies {
// DataStore library
implementation("androidx.datastore:datastore:1.1.7")
// The Preferences DataStore library
implementation("androidx.datastore:datastore-preferences:1.1.7")
}
Menentukan class DataStore
Anda dapat menentukan class DataStore dengan DataStoreFactory di dalam sumber umum modul KMP bersama Anda. Dengan menempatkan class ini di sumber umum, class tersebut dapat dibagikan di semua platform target. Anda dapat menggunakan deklarasi actual dan
expect untuk membuat penerapan
khusus platform.
Buat instance DataStore
Anda perlu menentukan cara membuat instance objek DataStore di setiap platform. Ini adalah satu-satunya bagian API yang harus ada di set sumber platform tertentu karena perbedaan dalam API sistem file.
Umum
// 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
Untuk membuat instance DataStore di Android, Anda memerlukan Context beserta jalur.
// shared/src/androidMain/kotlin/createDataStore.android.kt
fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)
iOS
Di iOS, Anda dapat mengambil jalur dari 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)
Untuk membuat instance DataStore di JVM (Desktop), berikan jalur menggunakan Java
atau Kotlin API:
// shared/src/jvmMain/kotlin/createDataStore.desktop.kt
fun createDataStore(): DataStore<Preferences> = createDataStore(
producePath = {
val file = File(System.getProperty("java.io.tmpdir"), dataStoreFileName)
file.absolutePath
}
)