PersistentCooldownService class
Keyed cooldown tracker (reward claim timers, booster reuse delays, PvP action gates, ...) that survives app restart and resists clock-rewind cheating.
Every read is computed lazily from nowMsClamped against a persisted
key -> endMs map — the same anti-cheat clamp utils/clamped_clock.dart
gives daily rewards/streaks and EnergyService uses for its own regen
math. There is deliberately no timer of any kind here, per-key or
shared: N active cooldowns cost zero background timers, same as
EnergyService never runs one for its own regen. A UI countdown (e.g.
CooldownCountdownChip) drives its own per-second tick to animate a
value this service already computed instantly.
- Inheritance
-
- Object
- GetLifeCycle
- DisposableInterface
- GetxService
- PersistentCooldownService
Constructors
Properties
- hashCode → int
-
The hash code for this object.
no setterinherited
- initialized → bool
-
Checks whether the controller has already been initialized.
no setterinherited
- isClosed → bool
-
Checks whether the controller has already been closed.
no setterinherited
-
onDelete
→ InternalFinalCallback<
void> -
Internal callback that starts the cycle of this controller.
finalinherited
-
onStart
→ InternalFinalCallback<
void> -
Called at the exact moment the widget is allocated in memory.
It uses an internal "callable" type, to avoid any @overrides in subclases.
This method should be internal and is required to define the
lifetime cycle of the subclass.
finalinherited
- revision → RxInt
-
Bumped on every start/cancel — wrap a read in
Obx(or listen to this directly) to rebuild when a cooldown's structural state changes. Never bumped by the mere passage of time: nothing here polls a clock, so there is nothing to notify on a tick.final - runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
Methods
-
$configureLifeCycle(
) → void -
inherited
-
cancel(
String key) → void -
Cancels the cooldown at
key— statusOf reports CooldownStatus.ready immediately afterward. A no-op on storage (but still bumps revision) ifkeywasn't running. -
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
onClose(
) → void -
Called before
onDeletemethod.onClosemight be used to dispose resources used by the controller. Like closing events, or streams before the controller is destroyed. Or dispose objects that can potentially create some memory leaks, like TextEditingControllers, AnimationControllers. Might be useful as well to persist some data on disk.inherited -
onInit(
) → void -
Called immediately after the widget is allocated in memory.
You might use this to initialize something for the controller.
inherited
-
onReady(
) → void -
Called 1 frame after onInit(). It is the perfect place to enter
navigation events, like snackbar, dialogs, or a new route, or
async request.
inherited
-
remainingOf(
String key) → Duration -
snapshotOf(
String key) → CooldownSnapshot -
start(
String key, Duration duration) → void -
Starts (or restarts, if already running) the cooldown at
keyto enddurationfrom now. Persists immediately (not write-behind-buffered) — a missed write on kill here would let a booster/reward be reused for free, the same "real transaction" class as a purchase. -
statusOf(
String key) → CooldownStatus -
toString(
) → String -
A string representation of this object.
inherited
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited
Static Properties
- maybe → PersistentCooldownService?
-
Gets the instance if already registered (safe to call from call sites
that may run before/without this service registered, e.g. widget
tests).
no setter