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