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
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
-
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