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

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

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

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

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

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

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

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

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

सामान्य

// shared/src/commonMain/kotlin/createDataStore.kt

/**
 *   Gets the singleton DataStore instance, creating it if necessary.
 */
fun createDataStore(storage: Storage<Preferences>): DataStore<Preferences> =
        DataStoreFactory.create(storage = storage)

internal const val dataStoreFileName = "dice.preferences_pb"

Android

Android पर DataStore इंस्टेंस बनाने के लिए, आपको पाथ के साथ Context की ज़रूरत होगी.

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

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = FileStorage(
        serializer = PreferencesSerializer,
        produceFile = { context.filesDir.resolve(dataStoreFileName) }
    )
)

iOS

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

// shared/src/iosMain/kotlin/createDataStore.ios.kt

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = OkioStorage(
        fileSystem = FileSystem.SYSTEM,
        serializer = PreferencesSerializer,
        producePath = {
            val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
                directory = NSDocumentDirectory,
                inDomain = NSUserDomainMask,
                appropriateForURL = null,
                create = false,
                error = null,
            )
            (requireNotNull(documentDirectory).path + "/$dataStoreFileName").toPath()
        }
    )
)

वेब

वेब पर DataStore इंस्टेंस बनाने के लिए, WebLocalStorage या WebSessionStorage का इस्तेमाल किया जा सकता है:

// shared/src/jsMain/kotlin/createDataStore.web.kt (also works for wasmJsMain)

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = WebLocalStorage(
        serializer = PreferencesSerializer,
        name = dataStoreFileName
    )
)

जेवीएम (डेस्कटॉप)

जेवीएम (डेस्कटॉप) पर DataStore इंस्टेंस बनाने के लिए, Java या Kotlin एपीआई का इस्तेमाल करके पाथ दें:

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

fun createDataStore(): DataStore<Preferences> = createDataStore(
    storage = FileStorage(
        serializer = PreferencesSerializer,
        produceFile = { File(System.getProperty("java.io.tmpdir"), dataStoreFileName) }
    )
)