# pausable_timer 3.1.0+3

A timer implementation that can be paused, resumed and reset.




## Installing
```
export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add pausable_timer
```
Published: 2023-10-30T00:08:02.753058Z
Expected archive SHA-256: 6ef1a95441ec3439de6fb63f39a011b67e693198e7dae14e20675c3c00e86074

Available in cache; verification: upstream_checksum
## Direct dependencies
- clock: ^1.1.0

## Package README (untrusted upstream documentation)
# pausable\_timer

[![CI](https://github.com/llucax/pausable_timer/workflows/CI/badge.svg)](https://github.com/llucax/pausable_timer/actions?query=branch%3Amain+workflow%3ACI+)
[![Pub Score](https://github.com/llucax/pausable_timer/workflows/Pub%20Score/badge.svg)](https://github.com/llucax/pausable_timer/actions?query=branch%3Amain+workflow%3A%22Pub+Score%22+)
[![Latest Dart version](https://github.com/llucax/pausable_timer/actions/workflows/check-dart.yaml/badge.svg)](https://github.com/llucax/pausable_timer/actions/workflows/check-dart.yaml)
[![Coverage](https://codecov.io/gh/llucax/pausable_timer/branch/main/graph/badge.svg)](https://codecov.io/gh/llucax/pausable_timer)
[![pub package](https://img.shields.io/pub/v/pausable_timer.svg)](https://pub.dev/packages/pausable_timer)
[![pub points](https://img.shields.io/pub/points/pausable_timer)](https://pub.dev/packages/pausable_timer/score)
[![popularity](https://img.shields.io/pub/popularity/pausable_timer)](https://pub.dev/packages/pausable_timer/score)
[![likes](https://img.shields.io/pub/likes/pausable_timer)](https://pub.dev/packages/pausable_timer/score)
[![Sponsor (llucax)](https://img.shields.io/badge/-Sponsor%20(llucasx)-555555?style=flat-square)](https://github.com/llucax/llucax/blob/main/sponsoring-platforms.md)[![GitHub Sponsors](https://img.shields.io/badge/--ea4aaa?logo=github&style=flat-square)](https://github.com/sponsors/llucax)[![Liberapay](https://img.shields.io/badge/--f6c915?logo=liberapay&logoColor=black&style=flat-square)](https://liberapay.com/llucax/donate)[![Paypal](https://img.shields.io/badge/--0070ba?logo=paypal&style=flat-square)](https://www.paypal.com/donate?hosted_button_id=UZRR3REUC4SY2)[![Buy Me A Coffee](https://img.shields.io/badge/--ff813f?logo=buy-me-a-coffee&logoColor=white&style=flat-square)](https://www.buymeacoffee.com/llucax)[![Patreon](https://img.shields.io/badge/--f96854?logo=patreon&logoColor=white&style=flat-square)](https://www.patreon.com/llucax)[![Flattr](https://img.shields.io/badge/--6bc76b?logo=flattr&logoColor=white&style=flat-square)](https://flattr.com/@llucax)
[![Sponsor (mateusfccp)](https://img.shields.io/badge/-Sponsor%20(mateusfccp)-555555?style=flat-square)](https://github.com/sponsors/mateusfccp)[![GitHub Sponsors](https://img.shields.io/badge/--ea4aaa?logo=github&style=flat-square)](https://github.com/sponsors/mateusfccp)

A [Dart](https://dart.dev/)
[timer](https://api.dart.dev/stable/dart-async/Timer/Timer.html) that can be
paused, resumed and reset.

## Example using `start()`, `pause()` and `reset()`

```dart
import 'package:pausable_timer/pausable_timer.dart';

void main() async {
  print('Create a timer that fires in 1 second, but it is not started yet');
  final timer = PausableTimer(Duration(seconds: 1), () => print('Fired!'));
  print('So we start it');
  timer.start();

  print('And wait 1/2 second...');
  await Future<void>.delayed(timer.duration ~/ 2);
  print('Not yet fired, still 1/2 second to go!');

  print('We can pause it now');
  timer.pause();

  // When paused, time can pass but the timer won't be fired
  print('And we wait a whole second...');
  await Future<void>.delayed(timer.duration);
  print("But our timer doesn't care while it's paused");
  print('It will still wait for ${timer.duration - timer.elapsed} after '
      "it's started again");

  print('So we start it again');
  timer.start();
  print('And wait for 1/2 second again, it should have fired when we are done');
  await Future<void>.delayed(timer.duration ~/ 2);
  print('And we are done, "Fired!" should be up there 👆');
  print('Now our timer completed ${timer.tick} tick');

  print('We can reset it if we want to use it again');
  timer.reset();
  print('We have to start it again after the reset because it was not running');
  timer.start();
  print('Now we wait a whole second in one go...');
  await Future<void>.delayed(timer.duration);
  print('And we are done, so you should see "Fired!" up there again 👆');
  print('Now the timer has ${timer.tick} ticks');

  print('We can reset it and start it again');
  timer.reset();
  timer.start();

  print('And you can cancel it too, so it will not fire again');
  timer.cancel();
  print("After a timer is cancelled, it can't be used again");
  print('But important information can still be retrieved:');
  print('duration: ${timer.duration}');
  print('elapsed: ${timer.elapsed}');
  print('tick: ${timer.tick}');
  print('isPaused: ${timer.isPaused}');
  print('isActive: ${timer.isActive}');
  print('isExpired: ${timer.isExpired}');
  print('isCancelled: ${timer.isCancelled}');
}
```

## Example pausable countdown implementation

```dart
// Example on how to implement countdown using PausableTimer.periodic
import 'dart:async';

import 'package:pausable_timer/pausable_timer.dart';

void main() async {
  // We make it "late" to be able to use the timer in the timer's callback.
  late final PausableTimer timer;
  var countDown = 5;

  print('Create a periodic timer that fires every 1 second and starts it');
  timer = PausableTimer.periodic(
    Duration(seconds: 1),
        () {
      countDown--;

      if (countDown == 0) {
        timer.pause();
      }

      print('\t$countDown');
    },
  )..start();

  print('And wait 2.1 seconds...');
  print('(0.1 extra to make sure there is no race between the timer and the '
      'waiting here)');
  await Future<void>.delayed(timer.duration * 2.1);
  print('By now 2 events should have fired: 4, 3\n');

  print('We can pause it now');
  timer.pause();

  print('And we wait for 2 more seconds...');
  await Future<void>.delayed(timer.duration * 2);
  print("But our timer doesn't care while it's paused\n");

  print('So we start it again');
  timer.start();
  print('And wait for 3.1 seconds more...');
  await Future<void>.delayed(timer.duration * 3.1);
  print('And we are done: 2, 1 and 0 should have been printed');

  print('The timer should be unpaused, inactive, expired and not cancelled');
  print('isPaused: ${timer.isPaused}');
  print('isActive: ${timer.isActive}');
  print('isExpired: ${timer.isExpired}');
  print('isCancelled: ${timer.isCancelled}');

  print('We can now reset it and start it again, now for 3 seconds');
  countDown = 3;
  timer
    ..reset()
    ..start();
  print('And wait for 3.1 seconds...');
  await Future<void>.delayed(timer.duration * 3.1);
  print('And it should be done printing: 2, 1 and 0');
}
```

## Changelog
## 3.1.0+3

- Fix README.md reference to `yaml` file

## 3.1.0+2

- Update README.md countdown example to use `PausableTimer.periodic`
- Rename `.yml` files to `.yaml`, which is the [recommended](https://yaml.org/faq.html) extension
- Use single quote in `wip.yaml` so that backticks won't expand to commands

## 3.1.0+1

- Automate pub.dev publishing with GitHub Actions

## 3.1.0

- Provide `.periodic` constructor (#45)
  - A periodic timer should behave similar to [Timer.periodic](https://api.dart.dev/stable/dart-async/Timer/Timer.periodic.html)

## 3.0.0

- **BREAKING:** `PausableTimer` is now `final`
- Minor cleanups and fixes in documentations and tests

## 2.0.0+1

- Update and test against Dart 3.1.

[More details available in
GitHub](https://github.com/llucax/pausable_timer/milestone/14?closed=1).

## 2.0.0

- Update and test against Dart 3.0.
- Bump dependencies and configuration to work with Dart 3.0.
- Because of the above, drop support for Dart 2.x.

**NOTE:** If you need to use Dart 2.x you can stick to the 1.x branch series.
Even more, those releases seem to be forward-compatible with Dart 3.0, so
upgrading should only be necessary if you also need to bump other dependencies.

**WANTED:** It's been almost 2 years since the last time I used Dart or
Flutter, and while I enjoy maintaining open source projects, it is becoming
more and more difficult to keep up to date with changes in Dart and maintaining
this project, so **I'm looking for a maintainer willing to take over this
project** to ensure its health in the future.  Please [get in
touch](https://github.com/llucax/pausable_timer/discussions/55) if you are
interested.

[More details available in
GitHub](https://github.com/llucax/pausable_timer/milestone/13?closed=1).

## 1.0.0+7

- Update and test against Dart 2.19.

[More details available in
GitHub](https://github.com/llucax/pausable_timer/milestone/12?closed=1).

## 1.0.0+6

- Add funding link to `pubspec.yaml`.
- Update and test against Dart 2.18.

[More details available in
GitHub](https://github.com/llucax/pausable_timer/milestone/11?closed=1).

## 1.0.0+5

- Update and test against Dart 2.17.

[More details available in
GitHub](https://github.com/llucax/pausable_timer/milestone/9?closed=1).

## 1.0.0+4

- Update and test against Dart 2.16.

[More details available in
GitHub](https://github.com/llucax/pausable_timer/milestone/8?closed=1).

## 1.0.0+3

- Update and test against Dart 2.15.
- Update dependencies.

[More details available in
GitHub](https://github.com/llucax/pausable_timer/milestone/8?closed=1).

## 1.0.0+2

- Improve CI of the project
- Update example to use `late` instead of an extra variable to avoid `!`.
- Update and test against Dart 2.14.

[More details available in
GitHub](https://github.com/llucax/pausable_timer/milestone/7?closed=1).

## 1.0.0+1

This is a symbolic release marking that this package is stable (it has
been used for some time now without further issues) and there is no plan
to change the API in a near future.

The code is exacly the same as in version v0.2.0+1.

## 1.0.0

Unpublished version due to errors in the release process.

## 0.2.0+1

- Fix minimum dart SDK version (use a final release, not a pre-release).

**NOTE:** Unless critical issues are found, this release will be released as
1.0.0 with no other changes since it has been pretty stable for a while now,
and no API breaking changes are expected for a long while either.

## 0.2.0

- Bump dependencies.

**NOTE:** Due to a wrongly specified minimum dart SDK version, this version was
never published in pub.dev.

## 0.2.0-nullsafety.0

- Make package [null-safe](https://dart.dev/null-safety).

  **NOTE:** This means the minimum supported Dart version has been bumped to 2.12.

## 0.1.0+2

- Add example implementing a pausable countdown.

## 0.1.0+1

- Add build status and sponsorship badges.

## 0.1.0

- Initial version.







 
