Thư viện DataStore lưu trữ dữ liệu một cách không đồng bộ, nhất quán và có thể chia sẻ, giúp khắc phục một số hạn chế của SharedPreferences. Trang này tập trung vào việc tạo DataStore trong các dự án Kotlin Multiplatform (KMP). Để biết thêm thông tin về DataStore, hãy xem tài liệu chính về DataStore và các mẫu chính thức.
Thiết lập phần phụ thuộc
DataStore hỗ trợ KMP trong phiên bản 1.1.0 trở lên.
Để thiết lập DataStore trong dự án KMP, hãy thêm các phần phụ thuộc cho cấu phần phần mềm trong tệp build.gradle.kts
cho mô-đun của bạn:
androidx.datastore:datastore
– Thư viện DataStoreandroidx.datastore:datastore-preferences
– Thư viện Preferences DataStore
Xác định các lớp DataStore
Bạn có thể xác định lớp DataStore
có DataStoreFactory
bên trong nguồn chung của mô-đun KMP dùng chung. Việc đặt các lớp này trong các nguồn chung sẽ cho phép chia sẻ chúng trên tất cả nền tảng mục tiêu. Bạn có thể sử dụng nội dung khai báo actual
và expect
để tạo các nội dung triển khai dành riêng cho nền tảng.
Tạo thực thể DataStore
Bạn cần xác định cách tạo thực thể cho đối tượng DataStore trên mỗi nền tảng. Đây là phần duy nhất của API cần có trong các nhóm tài nguyên nền tảng cụ thể do sự khác biệt về API hệ thống tệp.
Phổ biến
// 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
Để tạo thực thể DataStore
, bạn cần có một Context
cùng với đường dẫn tệp.
// shared/src/androidMain/kotlin/createDataStore.android.kt
fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)
iOS
Để tạo một phiên bản DataStore, bạn cần có một nhà máy cơ sở dữ liệu cùng với đường dẫn cơ sở dữ liệu.
// 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"
}
)