setEnsured method
Sets a value and ensures it's written to storage before completing.
Parameters:
value: The value to setoptimistic: If true, sets the signal value first, then writes to storage. On write failure, rolls back to the previous value (faster UX but may require rollback). If false, writes to storage first, only updates signal on success (safer but user must wait). Defaults to false.
Returns: A Future that completes with true if write succeeded, false otherwise
Implementation
@override
Future<bool> setEnsured(T value, {bool optimistic = false}) async {
// Wait for all ongoing write operations to complete
await _waitForWrites();
if (optimistic) {
final previousValue = peek;
final saveVersion = ++_version;
super.set(value);
hasInitialized = true;
try {
await _performWrite(value);
return true;
} catch (_) {
// Rollback only if version hasn't changed (no concurrent operations)
if (_version == saveVersion) {
super.set(previousValue);
_version = saveVersion - 1;
}
return false;
}
} else {
// Non-optimistic: write first, then update
try {
final saveVersion = ++_version;
await _performWrite(value);
hasInitialized = true;
if (_version == saveVersion) super.set(value);
return true;
} catch (_) {
return false;
}
}
}