फ़्लो के बारे में जानकारी

Home API का Kotlin वर्शन, फ़्लो का इस्तेमाल करता है. यह Kotlin भाषा की एक सुविधा है, जो एक साथ काम न करने वाली डेटा स्ट्रीम को मैनेज करने के लिए बेहतरीन सुविधाएं उपलब्ध कराती है. इनमें डेटा को बदलना, फ़िल्टर करना, मैप करना, कलेक्शन में बदलना वगैरह शामिल है.

कोरुटाइन, फ़्लो से काफ़ी मिलते-जुलते हैं. साथ ही, ये असाइनोक्रोनस कोड लिखने के लिए बेहतरीन एब्स्ट्रैक्शन देते हैं. साथ ही, डेवलपर को कॉलबैक रूटीन को साफ़ तौर पर लिखने से भी मुक्त करते हैं. फ़्लो, कोरूटीन के साथ मिलकर काम करते हैं. इनकी मदद से, कोरूटीन से डेटा को एसिंक्रोनस तरीके से हासिल किया जा सकता है. इसके लिए, किसी फ़ंक्शन या थ्रेड के पूरा होने का इंतज़ार करने की ज़रूरत नहीं होती.

डेटा को इकट्ठा करना नाम की प्रोसेस में, उपभोक्ता किसी फ़्लो से डेटा हासिल करता है. Kotlin फ़्लो में collect() फ़ंक्शन होता है, जिसका इस्तेमाल इस काम के लिए किया जा सकता है. डेटा इकट्ठा करने के दौरान किसी फ़्लो में क्या होता है, यह फ़्लो के टाइप पर निर्भर करता है.

Kotlin फ़्लो (Flow<T>), डिफ़ॉल्ट रूप से कोल्ड होते हैं. इसका मतलब है कि फ़्लो बिल्डर कोड सिर्फ़ तब डेटा जनरेट करता है, जब collect() को कॉल किया जाता है. इसके उलट, हॉट फ़्लो तुरंत डेटा जनरेट करता है. साथ ही, डेटा का इस्तेमाल होने पर, उसे मेमोरी में कतार की तरह बफ़र करता है. यह मेमोरी में डेटा सेव करता है, इसलिए हॉट फ़्लो को स्टेटफ़ुल माना जाता है.

shareIn ऑपरेटर का इस्तेमाल करके, फ़्लो को कोल्ड से हॉट में बदला जा सकता है. इसके बारे में ज़्यादा जानने के लिए, shareIn का इस्तेमाल करके कोल्ड फ़्लो को हॉट फ़्लो में बदलना लेख पढ़ें. इसके अलावा, SharedFlow या StateFlow का इस्तेमाल करके भी कोल्ड फ़्लो को हॉट फ़्लो में बदला जा सकता है.

सैंपल ऐप्लिकेशन, फ़्लो का इस्तेमाल कैसे करता है

सैंपल ऐप्लिकेशन, Jetpack Compose में व्यू मॉडल का इस्तेमाल करता है. ये मॉडल, Home के एपीआई के फ़्लो से जुड़े होते हैं. ऐप्लिकेशन के कई सैंपल यूज़र इंटरफ़ेस (यूआई) एलिमेंट, स्टेटस के हिसाब से काम करते हैं. हालांकि, इनसे इंटरैक्ट किया जा सकता है. सैंपल ऐप्लिकेशन, रीयल टाइम में उपयोगकर्ता अनुभव देने के लिए, डिवाइसों की स्थिति को यूज़र इंटरफ़ेस (यूआई) में 'आशाजनक' स्थिति के साथ ब्लेंड भी करता है. ऑप्टिमिज़्म का मतलब है कि ऐप्लिकेशन यह मानता है कि कोई कार्रवाई पूरी हो गई है. साथ ही, पुष्टि का इंतज़ार किए बिना, उम्मीद के मुताबिक नतीजे दिखाने के लिए यूज़र इंटरफ़ेस (यूआई) को तुरंत अपडेट करता है. अगर ऐसा होता है कि कार्रवाई पूरी नहीं हो पाती, तो यूज़र इंटरफ़ेस (यूआई) को असल स्थिति दिखाने के लिए अपडेट किया जाता है.

सैंपल ऐप्लिकेशन में, व्यू मॉडल की हर लेयर (स्ट्रक्चर, कमरे, डिवाइस) के लिए फ़्लो बनाए जाते हैं. उदाहरण के लिए, यह GlobalViewModel.kt में इन कॉल वाले स्ट्रक्चर के लिए ऐसा करता है:

  fun getStructuresState(): StateFlow<List<StructureModel>?> =
    homeClient
      .structures()
      .map { structures -> structures.map { StructureModel(it.name, it) }.sortedBy { it.name } }
      .handleErrors()
      .flowOn(Dispatchers.IO)
      .stateIn(scope = viewModelScope, started = SharingStarted.WhileSubscribed(), null)

emitAll(), दिए गए फ़्लो से सभी वैल्यू इकट्ठा करता है और उन्हें इकट्ठा करने वाले टूल पर भेजता है. stateIn(), अपस्ट्रीम फ़्लो के एक रनिंग इंस्टेंस से हाल ही में उत्सर्जित की गई वैल्यू को, डाउनस्ट्रीम के कई सदस्यों के साथ शेयर करता है. ज़्यादा जानकारी के लिए, kotlinx.coroutines.flow रेफ़रंस देखें.

Jetpack Compose

फ़्लो ऑब्जेक्ट को लोकल मेमोरी में सेव करने और उन्हें बंद होने से रोकने के लिए, Kotlin remember API का इस्तेमाल करें.

Jetpack Compose में, अगर इसका इस्तेमाल collectAsStateWithLifecycle() के साथ किया जाता है, तो Jetpack, फ़्लो से सदस्यता लेने और सदस्यता छोड़ने की प्रोसेस को अपने-आप मैनेज करता है. यह इस बात पर निर्भर करता है कि उस स्थिति को दिखाने वाला ऐप्लिकेशन यूज़र इंटरफ़ेस (यूआई) असल में फ़ोरग्राउंड में है या नहीं.

सैंपल ऐप्लिकेशन में, एक साधारण कॉल से ऐसा किया जा सकता है. पहले दिखाए गए getStructuresState() फ़ंक्शन का इस्तेमाल करके:

val structuresList by
    remember(globalViewModel) { globalViewModel.getStructuresState() }.collectAsStateWithLifecycle()

अब, जब स्ट्रक्चर का कोई स्टेटस बदलता है, जैसे कि name, तो उसका इस्तेमाल करने वाला Composable फ़ंक्शन, अपडेट किए गए स्टेटस को अपने-आप दिखाएगा. सैंपल ऐप्लिकेशन में, यह HomeActivityContent() फ़ंक्शन है.

संसाधन

Kotlin, फ़्लो, कोरुटाइन, और Jetpack Compose के बारे में ज़्यादा जानकारी के लिए, ये रिसॉर्स देखें: