DataStore (Kotlin मल्टीप्लैटफ़ॉर्म)

DataStore लाइब्रेरी, डेटा को सिंक किए बिना, लगातार, और लेन-देन के हिसाब से स्टोर करती है. इससे, SharedPreferences की कुछ समस्याओं को हल किया जा सकता है. इस पेज पर, Kotlin Multiplatform (KMP) प्रोजेक्ट में DataStore बनाने के बारे में बताया गया है. DataStore के बारे में ज़्यादा जानकारी के लिए, DataStore के लिए मुख्य दस्तावेज़ और आधिकारिक सैंपल देखें.

डिपेंडेंसी सेट अप करना

अपने KMP प्रोजेक्ट में DataStore सेट अप करने के लिए, अपने मॉड्यूल की build.gradle.kts फ़ाइल में आर्टफ़ैक्ट के लिए डिपेंडेंसी जोड़ें:

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

DataStore क्लास तय करना

शेयर किए गए KMP मॉड्यूल के कॉमन सोर्स में, DataStore क्लास को DataStoreFactory के साथ तय किया जा सकता है. इन क्लास को सामान्य सोर्स में डालने से, इन्हें सभी टारगेट प्लैटफ़ॉर्म पर शेयर किया जा सकता है. प्लैटफ़ॉर्म के हिसाब से लागू करने के लिए, actual और expect एलान का इस्तेमाल किया जा सकता है.

DataStore इंस्टेंस बनाना

आपको हर प्लैटफ़ॉर्म पर DataStore ऑब्जेक्ट को इंस्टैंशिएट करने का तरीका तय करना होगा. फ़ाइल सिस्टम एपीआई में अंतर की वजह से, एपीआई का यह हिस्सा ही किसी खास प्लैटफ़ॉर्म के सोर्स सेट में होना ज़रूरी है.

सामान्य

// 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 पर DataStore इंस्टेंस बनाने के लिए, आपको पाथ के साथ-साथ Context की ज़रूरत होगी.

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

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

iOS

iOS पर, NSDocumentDirectory से पाथ वापस पाया जा सकता है:

// 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 (डेस्कटॉप) पर DataStore इंस्टेंस बनाने के लिए, Java या Kotlin एपीआई का इस्तेमाल करके कोई पाथ दें:

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

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