DataStore (Kotlin Çoklu Platform)

DataStore kitaplığı, verileri SharedPreferences'in bazı dezavantajlarını ortadan kaldırarak verileri asenkron, tutarlı ve işlemsel olarak depolar. Bu sayfada, Kotlin Multiplatform (KMP) projelerinde DataStore oluşturmaya odaklanılmıştır. Datastore hakkında daha fazla bilgi için Datastore'un birincil belgelerine ve resmi örneklerine bakın.

Bağımlılıkları ayarlama

KMP projenizde DataStore'u ayarlamak için modülünüzün build.gradle.kts dosyasına yapıların bağımlılıklarını ekleyin:

commonMain.dependencies {
  // DataStore library
  implementation("androidx.datastore:datastore:1.1.7")
  // The Preferences DataStore library
  implementation("androidx.datastore:datastore-preferences:1.1.7")
}

Veri deposu sınıflarını tanımlama

Paylaşılan KMP modülünüzün ortak kaynağında DataStore sınıfını DataStoreFactory ile tanımlayabilirsiniz. Bu sınıfları ortak kaynaklara yerleştirmek, tüm hedef platformlarda paylaşılmasına olanak tanır. Platforma özel uygulamalar oluşturmak için actual ve expect bildirimlerini kullanabilirsiniz.

DataStore örneğini oluşturma

DataStore nesnesinin her platformda nasıl oluşturulacağını tanımlamanız gerekir. Dosya sistemi API'lerindeki farklılıklar nedeniyle API'nin, belirli platform kaynak kümelerinde bulunması gereken tek parçası budur.

Genel

// shared/src/commonMain/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

Android'de DataStore örneğini oluşturmak için yola Context eklemeniz gerekir.

// shared/src/androidMain/kotlin/createDataStore.android.kt

fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
    producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)

iOS

iOS'te yolu NSDocumentDirectory'den alabilirsiniz:

// shared/src/iosMain/kotlin/createDataStore.ios.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"
    }
)

JVM (Masaüstü)

JVM'de (masaüstü) DataStore örneğini oluşturmak için Java veya Kotlin API'lerini kullanarak bir yol sağlayın:

// shared/src/jvmMain/kotlin/createDataStore.desktop.kt

fun createDataStore(): DataStore<Preferences> = createDataStore(
    producePath = {
      val file = File(System.getProperty("java.io.tmpdir"), dataStoreFileName)
      file.absolutePath
    }
)