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

PersistentCooldownService()

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) if key wasn't running.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
onClose() → void
Called before onDelete method. onClose might 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 key to end duration from 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