TimeBuilder.countdown constructor

TimeBuilder.countdown({
  1. Key? key,
  2. required DateTime start,
  3. required int seconds,
  4. required CountdownWidgetBuilder builder,
})

Creates a countdown, from the given start DateTime. Will call the builder, which is a CountdownWidgetBuilder, once per second, util the countdown reaches zero.

TimerWidget.countdown(
   reference: DateTime.now(),
   builder: (BuildContext context, int seconds, bool isFinished) => ...;
)

Implementation

factory TimeBuilder.countdown({
  Key? key,
  required DateTime start,
  required int seconds,
  required CountdownWidgetBuilder builder,
}) {
  return TimeBuilder(
    //
    key: key,
    //
    ifShouldTickAndRebuild: ({
      required DateTime currentTime,
      required DateTime? lastTickTime,
      required DateTime initialTime,
      required int ticks,
    }) {
      return (lastTickTime == null || (currentTime.second != lastTickTime.second));
    },
    //
    isFinished: ({
      required DateTime currentTime,
      required DateTime? lastTickTime,
      required DateTime initialTime,
      required int ticks,
    }) {
      if (lastTickTime != null && (currentTime.second == lastTickTime.second))
        return false;

      int _seconds =
          (start.add(Duration(seconds: seconds))).difference(currentTime).inSeconds;

      return _seconds <= 0;
    },
    builder: ({
      required BuildContext context,

      /// The time of the current tick.
      /// This is the same as the current time (or very similar).
      required DateTime currentTickTime,

      /// The time when the [TimeBuilder] was created.
      required DateTime initialTime,

      /// The number of ticks since the timer started.
      required int ticks,

      /// This is `false` while the [TimeBuilder] is ticking,
      /// and becomes `true` as soon as it finishes.
      required bool isFinished,
    }) {
      int _seconds =
          (start.add(Duration(seconds: seconds))).difference(clock.now()).inSeconds;
      return builder(
        context: context,
        currentTickTime: clock.now(),
        initialTime: initialTime,
        ticks: ticks,
        isFinished: isFinished,
        countdown: _seconds,
      );
    },
    //
  );
}