
When updating a MutableStateFlow, you have two options. Here is how to decide instantly.
🧑🏻💻 The Golden Rule
- Use update { } if the new value depends on the current value (e.g., incrementing a counter, toggling a boolean).
- Use value = if you are completely overwriting the state (e.g., setting a loading state, resetting data).
🧑🏻💻 Why does it matter?
Direct assignment (value = ...) is not thread-safe for "read-modify-write" operations.
If two coroutines try to update the state simultaneously using .value = .value + 1, you risk a Race Condition where one update is lost.
The update function is atomic. It uses a Compare-And-Set mechanism to ensure that updates happen sequentially and safely, even across multiple threads.
🧑🏻💻 Code Comparison
❌ Risky (Race Condition prone)
// If called concurrently, updates might be lost
_uiState.value = _uiState.value.copy(count = _uiState.value.count + 1)
✅ Safe (Thread-safe)
// Guarantees consistency
_uiState.update { it.copy(count = it.count + 1) }
✅ Safe (Overwrite)
// No race condition risk because we ignore the previous state
_uiState.value = UiState.Loading
🧑🏻💻 Summary
When in doubt, use update. It is safer by default and prevents subtle concurrency bugs.
Related Categories : Android・AndroidStudio・Developmemt・JetBrains・Kotlin・Newbie・Recommended・Reputation