StateFlow: UI के लिए Hot State Holder
StateFlow को reactive state container के रूप में उपयोग करें और ViewModels में observe करें।
StateFlow: UI के लिए Hot State Holder, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
StateFlow क्या है
StateFlow एक हॉट, स्टेट रखने वाला फ़्लो है, जिसमें हमेशा कोई मान रहता है और जो सभी कलेक्टर को अपडेट भेजता है। यह आधुनिक Kotlin आर्किटेक्चर में LiveData का स्थान लेता है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val stateFlow = MutableStateFlow(0) // initial value
println("Current: ${stateFlow.value}")
stateFlow.value = 42
println("Updated: ${stateFlow.value}")
}MutableStateFlow और StateFlow
MutableStateFlow आंतरिक रूप से उपयोग किया जाने वाला परिवर्तनशील इम्प्लीमेंटेशन है। बाहरी ऑब्ज़र्वर के लिए StateFlow को रीड-ओनली रूप में कास्ट करके या .asStateFlow() का उपयोग करके एक्सपोज़ करें।
import kotlinx.coroutines.flow.*
class CounterViewModel {
private val _count = MutableStateFlow(0) // mutable internally
val count: StateFlow<Int> = _count.asStateFlow() // read-only externally
fun increment() { _count.value++ }
fun decrement() { _count.value-- }
}StateFlow को कलेक्ट करना
StateFlow को किसी भी अन्य फ़्लो की तरह कलेक्ट करें। कलेक्शन शुरू होते ही नवीनतम मान तुरंत उत्सर्जित होता है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val state = MutableStateFlow("loading")
launch {
state.collect { println("State: $it") }
}
delay(50); state.value = "success"
delay(50); state.value = "idle"
delay(50)
coroutineContext.cancelChildren()
}StateFlow डुप्लिकेट मानों को समेटता है
StateFlow केवल मान बदलने पर उत्सर्जन करता है। यदि आप एक ही मान दो बार सेट करते हैं, तो केवल एक उत्सर्जन होता है—यह लगातार आने वाले डुप्लिकेट मानों को एक कर देता है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val flow = MutableStateFlow("A")
launch {
flow.collect { println("Received: $it") }
}
delay(50)
flow.value = "A" // no emission — same value
flow.value = "B" // emits
flow.value = "B" // no emission — same value
flow.value = "C" // emits
delay(50)
coroutineContext.cancelChildren()
}ViewModel में StateFlow
मानक ViewModel पैटर्न: निजी MutableStateFlow को बिज़नेस लॉजिक बदलता है और सार्वजनिक StateFlow को यूआई ऑब्ज़र्व करता है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
sealed class UiState { object Loading : UiState(); data class Success(val data: String) : UiState(); data class Error(val msg: String) : UiState() }
class MyViewModel(scope: CoroutineScope) {
private val _uiState = MutableStateFlow<UiState>(UiState.Loading)
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
init {
scope.launch {
delay(100) // simulate load
_uiState.value = UiState.Success("Hello!")
}
}
}परमाण्विक परिवर्तन के लिए update()
वर्तमान मान के आधार पर स्टेट को परमाण्विक रूप से अपडेट करने के लिए update { } का उपयोग करें—समवर्ती अपडेट के लिए यह महत्वपूर्ण है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val counter = MutableStateFlow(0)
List(100) {
launch(Dispatchers.Default) {
counter.update { it + 1 } // thread-safe atomic update
}
}.forEach { it.join() }
println("Counter: ${counter.value}") // 100
}आशावादी अपडेट के लिए compareAndSet
compareAndSet(expect, update) नया मान तभी सेट करता है, जब वर्तमान मान expect से मेल खाता हो। यह आशावादी समवर्तीता के लिए उपयोगी है।
import kotlinx.coroutines.flow.*
fun main() {
val state = MutableStateFlow("idle")
val changed = state.compareAndSet("idle", "loading")
println("Changed: $changed, Value: ${state.value}") // true, loading
val changed2 = state.compareAndSet("idle", "error") // won't change
println("Changed: $changed2, Value: ${state.value}") // false, loading
}StateFlow और LiveData
StateFlow Android जीवनचक्र के बिना काम करता है। LiveData जीवनचक्र-जागरूक है, लेकिन केवल Android के लिए है। साझा KMP ViewModels के लिए StateFlow को प्राथमिकता दें।
import kotlinx.coroutines.flow.*
// StateFlow: pure Kotlin, works in commonMain
// val state = MutableStateFlow("value")
// LiveData: Android-only, lifecycle-aware
// val liveData = MutableLiveData("value")
// In Compose, collect StateFlow with:
// val state by viewModel.uiState.collectAsState()
fun main() { println("StateFlow: multiplatform; LiveData: Android-only") }stateIn: कोल्ड फ़्लो को StateFlow में बदलना
flow.stateIn(scope, started, initialValue) एक कोल्ड फ़्लो को हॉट StateFlow में बदलता है और सभी कलेक्टर के बीच एक सदस्यता साझा करता है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val cold = flow {
println("Fetching...")
delay(100)
emit("data")
}
val hot: StateFlow<String> = cold.stateIn(
scope = this,
started = SharingStarted.Lazily,
initialValue = "loading"
)
launch { hot.collect { println("A: $it") } }
launch { hot.collect { println("B: $it") } }
delay(200)
coroutineContext.cancelChildren()
}SharingStarted की रणनीतियाँ
तुरंत: तुरंत शुरू होता है। धीरे: पहले कलेक्टर के आने पर शुरू होता है। WhileSubscribed(stopTimeout): कोई कलेक्टर न होने पर रुकता है और किसी के सदस्यता लेने पर फिर शुरू होता है।
import kotlinx.coroutines.flow.*
// Eagerly: upstream starts right away
// SharingStarted.Eagerly
// Lazily: waits for first subscriber
// SharingStarted.Lazily
// WhileSubscribed: stops 5s after last subscriber
// SharingStarted.WhileSubscribed(5000)
// Typical ViewModel usage:
// val uiState = repo.dataFlow.stateIn(viewModelScope, WhileSubscribed(5000), Loading)व्युत्पन्न स्टेट को ऑब्ज़र्व करना
map + stateIn का उपयोग करके मौजूदा स्टेटफ़्लो से नया StateFlow बनाएँ। स्रोत बदलने पर व्युत्पन्न फ़्लो भी अपडेट होता है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val count = MutableStateFlow(5)
val doubled = count.map { it * 2 }.stateIn(this, SharingStarted.Eagerly, 10)
println(doubled.value) // 10
count.value = 7
delay(50)
println(doubled.value) // 14
coroutineContext.cancelChildren()
}त्वरित जाँच
जब आप StateFlow में एक ही मान दो बार सेट करते हैं, तो क्या होता है?
पुनरावलोकन
StateFlow एक हॉट, हमेशा मान रखने वाला और डुप्लिकेट मानों को समेटने वाला फ़्लो है। अंदर से MutableStateFlow का उपयोग करें और बाहर StateFlow एक्सपोज़ करें। समवर्ती परिवर्तनों के लिए अपडेट() और कोल्ड फ़्लो बदलने के लिए stateIn() का उपयोग करें।
एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 51
- पाठ
- 203
अक्सर पूछे जाने वाले प्रश्न
क्या “StateFlow: UI के लिए Hot State Holder” पाठ निःशुल्क है?
हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “StateFlow: UI के लिए Hot State Holder” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“StateFlow: UI के लिए Hot State Holder” में मैं क्या सीखूँगा?
StateFlow को reactive state container के रूप में उपयोग करें और ViewModels में observe करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“StateFlow: UI के लिए Hot State Holder” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- StateFlow: UI के लिए Hot State Holder
- SharedFlow: Event Buses और One-Shot Events
- shareIn और stateIn से Cold Flow को Hot में बदलना
- Turbine से StateFlow और SharedFlow का Testing