DataStore (Multiplatform Kotlin)

Library DataStore menyimpan data secara asinkron, konsisten, dan secara transaksional, mengatasi beberapa kelemahan SharedPreferences. Ini berfokus pada pembuatan DataStore di project Kotlin Multiplatform (KMP). Untuk mengetahui informasi selengkapnya tentang DataStore, lihat dokumentasi utama untuk DataStore dan contoh resmi.

Menyiapkan dependensi

DataStore mendukung KMP di versi 1.1.0 dan yang lebih tinggi.

Untuk menyiapkan DataStore di project KMP, tambahkan dependensi untuk artefak dalam file build.gradle.kts untuk modul Anda:

  • androidx.datastore:datastore - Library DataStore
  • androidx.datastore:datastore-preferences - Library Preferences DataStore

Menentukan class DataStore

Anda dapat menentukan class DataStore dengan DataStoreFactory di dalam fungsi sumber modul KMP yang dibagikan. Menempatkan class ini di sumber umum memungkinkan mereka untuk dibagikan di semua platform target. Anda dapat menggunakan Pernyataan actual dan expect yang akan dibuat implementasi khusus platform.

Membuat instance DataStore

Anda perlu menentukan cara membuat instance objek DataStore di setiap platform. Ini adalah satu-satunya bagian API yang harus ada di platform tertentu set sumber karena perbedaan dalam API sistem file.

Umum

// 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

Untuk membuat instance DataStore, Anda memerlukan Context beserta .

// shared/src/androidMain/kotlin/createDataStore.android.kt

fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
    producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)

iOS

Untuk membuat instance DataStore, Anda memerlukan factory database bersama dengan jalur database.

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