updateWith
inline fun <T : Any> MutableStateFlow<UiState<T>>.updateWith(crossinline operation: suspend T.() -> Result<Unit>)
Updates the UI state with the result of an async operation that performs an action without returning new data.
This function automatically handles the complete async operation lifecycle:
Sets
loading = truebefore starting the operationExecutes the operation in the ViewModel's coroutine scope
Preserves existing data on success (no data changes)
Sets error event on failure
Sets
loading = falsewhen complete
Use this function for async operations that perform actions but don't update screen data:
Saving/updating data without changing current view
Deleting items
Sending analytics events
Triggering background jobs
Any operation that returns
Result<Unit>
Kotlin Context Parameters
This function uses Kotlin's context parameters feature (context(viewModel: ViewModel)). The ViewModel context provides implicit access to viewModelScope for launching coroutines. You never need to pass the ViewModel explicitly - it's automatically available when called from within a ViewModel.
Usage Example
@HiltViewModel
class SettingsViewModel @Inject constructor(
private val repository: SettingsRepository
) : ViewModel() {
private val _uiState = MutableStateFlow(UiState(SettingsScreenData()))
val uiState = _uiState.asStateFlow()
fun saveSettings() {
_uiState.updateWith {
repository.saveSettings(this) // Returns Result<Unit>
}
}
fun deleteAccount() {
_uiState.updateWith {
repository.deleteAccount() // Returns Result<Unit>
}
}
}Difference from updateStateWith
updateStateWith: For operations that return new data → Updates UiState.dataupdateWith: For operations that return Unit → Preserves UiState.data
Error Handling
Errors are automatically caught and wrapped in OneTimeEvent
The error is displayed via StatefulComposable's snackbar mechanism
Original data is preserved when an error occurs
Duplicate Requests
If called while loading = true, the function returns immediately to prevent duplicate concurrent operations.
Parameters
Suspend lambda that receives current data and returns Result<Unit>. Typically calls a repository method that performs an action.
Type Parameters
The type of the screen data.
See also
for synchronous updates
for async operations that return new data
for wrapping repository operations in Result