DataStore (đa nền tảng Kotlin)

Thư viện DataStore lưu trữ dữ liệu một cách không đồng bộ, nhất quán và giúp khắc phục một số hạn chế của SharedPreferences. Chiến dịch 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ề DataStorecá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 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 DataStore
  • androidx.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 bằng DataStoreFactory bên trong phần tử chung nguồn của mô-đun KMP bạn đã chia sẻ. Đưa các lớp này vào trong các nguồn chung cho phép chúng được chia sẻ trên tất cả các nền tảng mục tiêu. Bạn có thể sử dụng Nội dung khai báo actualexpect để tạo nền tảng cụ thể.

Tạo phiên bản DataStore

Bạn cần xác định cách tạo thực thể cho đối tượng DataStore trên từng nền tảng. Đây là phần duy nhất của API bắt buộc phải có trong nền tảng cụ thể nhóm tài nguyên do sự khác biệt trong các 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 phiên bản thể hiện DataStore, bạn cần có 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 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"
    }
)