DataStore(Kotlin マルチプラットフォーム)

DataStore ライブラリは、データを非同期で一貫性をもって保存し、 SharedPreferences のいくつかの欠点を克服しています。この このページでは、Kotlin マルチプラットフォーム(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 クラスを定義する

DataStore クラスは、共通関数内で DataStoreFactory を使用して定義できます。 共有 KMP モジュールのソースを指定します。これらのクラスを共通のソースに配置すると、 すべてのターゲット プラットフォームで共有できます。次を使用: actual 宣言と expect 宣言: 実装するために使用できます。

DataStore インスタンスを作成する

各プラットフォームで DataStore オブジェクトをインスタンス化する方法を定義する必要があります。 これは、特定のプラットフォームに必要な 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"
    }
)