KMP के लिए DataStore सेट अप करना

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 क्लास तय करना

शेयर किए गए केएमपी मॉड्यूल के सामान्य सोर्स में, 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 API का इस्तेमाल करके पाथ दें:

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

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