DataStore (Kotlin หลายแพลตฟอร์ม)

ไลบรารี DataStore จัดเก็บข้อมูลแบบไม่พร้อมกัน สม่ำเสมอ และ แก้ไขข้อเสียบางประการของ SharedPreferences ช่วงเวลานี้ มุ่งเน้นที่การสร้าง DataStore ในโปรเจ็กต์ Kotlin Multiplatform (KMP) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ DataStore โปรดดู เอกสารหลักสำหรับ DataStore และตัวอย่างอย่างเป็นทางการ

การตั้งค่าทรัพยากร Dependency

DataStore รองรับ KMP ในเวอร์ชัน 1.1.0 ขึ้นไป

หากต้องการตั้งค่า DataStore ในโปรเจ็กต์ KMP ให้เพิ่มทรัพยากร Dependency สำหรับอาร์ติแฟกต์ ในไฟล์ build.gradle.kts สำหรับโมดูล

  • androidx.datastore:datastore - คลัง DataStore
  • androidx.datastore:datastore-preferences - ไลบรารี Preferences DataStore

กำหนดคลาส DataStore

คุณสามารถกำหนดคลาส DataStore ด้วย DataStoreFactory ภายในฟังก์ชันร่วม แหล่งที่มาของโมดูล KMP ที่แชร์ จัดชั้นเรียนเหล่านี้ในแหล่งที่มาทั่วไป ทำให้สามารถแชร์กับทุกแพลตฟอร์มเป้าหมายได้ คุณสามารถใช้ ประกาศ actual และ expect เพื่อสร้าง การติดตั้งใช้งานเฉพาะแพลตฟอร์ม

สร้างอินสแตนซ์ DataStore

คุณต้องกำหนดวิธีการสร้างอินสแตนซ์ออบเจ็กต์ DataStore ในแต่ละแพลตฟอร์ม นี่เป็นเพียงส่วนเดียวของ API ที่จำเป็นเพื่อให้อยู่ในแพลตฟอร์มนั้นๆ เนื่องจากความแตกต่างใน API ระบบไฟล์

ทั่วไป

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

หากต้องการสร้างอินสแตนซ์ DataStore คุณต้องมี Context พร้อมด้วย เส้นทางไฟล์

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

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

iOS

ในการสร้างอินสแตนซ์ DataStore คุณต้องมีโรงงานฐานข้อมูลพร้อมกับ ของฐานข้อมูล

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