DailyLoginService class

Tracks the daily-login streak: last claimed day, current position (1..7, cycling) in the reward cycle, and which days of the current cycle have already been claimed.

The ONLY source of "what day is it" is todayEpochDayClamped() (utils/clamped_clock.dart) — this service never calls DateTime.now() directly, so winding the device clock back can't be used to claim the same day twice or dodge the streak-reset penalty for a skipped day.

Inheritance
  • Object
  • GetLifeCycle
  • DisposableInterface
  • GetxService
  • DailyLoginService

Constructors

DailyLoginService({String? storageKey})

Properties

claimedDaysInCycle → Set<int>
Which cycle days (1..kDailyLoginCycleLength) have been claimed since the last reset/wrap.
no setter
currentStreakDay → int
Current streak position, 1..kDailyLoginCycleLength; 0 before the very first claim.
no setter
debugPendingSaves → Future<void>
Awaits every save queued so far — lets a test deterministically wait for a burst of rapid claimToday calls to fully settle instead of guessing a delay.
no setter
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
longestStreakEver → int
IDEA-49: highest number of TRUE consecutive claimed days ever reached — unlike currentStreakDay (which wraps 1..7 purely for the calendar UI), this counts past 7 and never resets when a streak breaks; it only ever grows. Starts at 0 before any claim.
no setter
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

Methods

$configureLifeCycle() → void
inherited
canClaimToday() → bool
Whether today's reward is still claimable (i.e. not already claimed).
claimToday() → DailyLoginClaimResult
Claims today's reward: advances the streak by one day, or resets it to day 1 if at least one full day was skipped since the last claim. Marks today claimed. A no-op (returns the unchanged current state, streakWasReset: false) if today was already claimed.
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
toString() → String
A string representation of this object.
inherited

Operators

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

Static Properties

maybe → DailyLoginService?
Gets the instance if already registered (safe to call from widget tests).
no setter