ไลบรารี DataStore จัดเก็บข้อมูลแบบไม่พร้อมกัน สม่ำเสมอ และ แก้ไขข้อเสียบางประการของ SharedPreferences ช่วงเวลานี้ มุ่งเน้นที่การสร้าง DataStore ในโปรเจ็กต์ Kotlin Multiplatform (KMP) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ DataStore โปรดดู เอกสารหลักสำหรับ DataStore และตัวอย่างอย่างเป็นทางการ
การตั้งค่าทรัพยากร Dependency
DataStore รองรับ KMP ในเวอร์ชัน 1.1.0 ขึ้นไป
หากต้องการตั้งค่า DataStore ในโปรเจ็กต์ KMP ให้เพิ่มทรัพยากร Dependency สำหรับอาร์ติแฟกต์
ในไฟล์ build.gradle.kts
สำหรับโมดูล
androidx.datastore:datastore
- คลัง DataStoreandroidx.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"
}
)