timer static method

Future<StreamSubscription<void>> timer({
  1. required String id,
  2. required String title,
  3. String? subtitle,
  4. required Duration duration,
  5. void onExpired()?,
})

Implementation

static Future<StreamSubscription<void>> timer({
  required String id,
  required String title,
  String? subtitle,
  required Duration duration,
  void Function()? onExpired,
}) async {
  final endTime = DateTime.now().add(duration);
  final total = duration.inSeconds.toDouble();
  await start(id: id, data: LiveActivityData(title: title, subtitle: subtitle, progress: 0, trailingText: _fmt(duration)));
  final sub = Stream<void>.periodic(const Duration(seconds: 1)).listen((_) async {
    final remaining = endTime.difference(DateTime.now());
    if (remaining.isNegative) {
      await update(id: id, data: LiveActivityData(title: '$title — Arrived!', subtitle: subtitle, progress: 1));
      await Future.delayed(const Duration(seconds: 3));
      await end(id);
      onExpired?.call();
    } else {
      await update(id: id, data: LiveActivityData(title: title, subtitle: subtitle,
          progress: ((total - remaining.inSeconds) / total).clamp(0, 1), trailingText: _fmt(remaining)));
    }
  });
  return sub;
}