DataStore (Kotlin Multiplatform)

DataStore 程式庫會以非同步、一致且 解決 SharedPreferences 的一些缺點。這個 頁面,著重於在 Kotlin Multiplatform (KMP) 專案中建立 DataStore。 如要進一步瞭解 DataStore,請參閱 DataStore官方範例的主要說明文件。

設定依附元件

DataStore 支援 1.1.0 以上版本的 KMP。

如要在 KMP 專案中設定 DataStore,請新增構件的依附元件 在模組的 build.gradle.kts 檔案中:

  • androidx.datastore:datastore - DataStore 程式庫
  • androidx.datastore:datastore-preferences - Preferences DataStore 程式庫

定義 DataStore 類別

您可以在常用函式中,使用 DataStoreFactory 定義 DataStore 類別 共用 KMP 模組的來源。將這些類別放在共同來源中 可讓所有目標平台共用這些檔案。別擔心!您可以使用 要建立的 actualexpect 宣告 特定平台適用的實作方式

建立 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"
    }
)