OfflineProgressionService class

Calculates idle/offline earnings accrued while the player was away: earnings = min(elapsed, maxOfflineCap) * productionRatePerSecond, where elapsed is time since the last claim.

Uses nowMsClamped — the same monotonic clock guarding daily rewards/streaks — as its default source of "what time is it", so winding the device clock back can't be used to re-farm offline earnings. A caller can opt into the stricter trustedClock instead (ENH-86) — see its own doc comment for when that's worth it over the default.

Doesn't include a "watch an ad to double" flow — that's an ad/UI concern a consumer app layers on top of claim (e.g. call claim then award the result again after a rewarded ad).

Inheritance
  • Object
  • GetLifeCycle
  • DisposableInterface
  • GetxService
  • OfflineProgressionService

Constructors

OfflineProgressionService({Duration maxOfflineCap = const Duration(hours: 8), TrustedClockService? trustedClock})

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
maxOfflineCap ↔ Duration
Elapsed time beyond this doesn't count, e.g. an 8h cap means a 3-day absence still only pays out 8 hours' worth.
getter/setter pair
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
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited
trustedClock → TrustedClockService?
Optional stricter clock (ENH-86) — when supplied, pendingEarnings and claim read "now" from TrustedClockService.nowMsTrusted instead of nowMsClamped. Left null (the default), behavior is completely unchanged from before this field existed.
final

Methods

$configureLifeCycle() → void
inherited
claim(double productionRatePerSecond) → Future<double>
Returns the earned amount and resets "last claimed" to now. Does not itself apply any ad-doubling — the caller decides whether to double it.
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
pendingEarnings(double productionRatePerSecond) → double
Pure calculation given the current config — does not mutate anything (does not reset the "last claimed" timestamp).
toString() → String
A string representation of this object.
inherited

Operators

operator ==(Object other) → bool
The equality operator.
inherited

Static Properties

maybe → OfflineProgressionService?
Safe to call from a call site that may run before/without this service registered (e.g. widget tests).
no setter