Timer.periodic în Dart

Rulează o funcție la fiecare interval de timp, până la cancel; tick numără câte intervale au trecut.

Sintaxă
factory Timer.periodic(Duration duration, void callback(Timer timer))
int get tick

Ce face Timer.periodic

Timer.periodic(durata, f) cheamă f după fiecare durata, la nesfârșit, până când chemi cancel(). Funcția primește chiar timer-ul, deci se poate opri singură.

tick spune câte intervale au trecut de la pornire. De obicei crește cu 1 la fiecare apel; dacă programul a fost ocupat și un apel a întârziat, tick poate sări peste valori, ca să rămână legat de timpul real.

Parametri

Parametru Descriere
duration Intervalul dintre apeluri.
callback Funcția chemată, care primește timer-ul.

Ce returnează

Un Timer periodic.

Exemple

Exemplul 1: Numărătoare care se oprește singură

import 'dart:async';

Future<void> main() async {
  final gata = Completer<void>();
  Timer.periodic(const Duration(milliseconds: 30), (t) {
    print('tick ${t.tick}: mai sunt ${3 - t.tick}');
    if (t.tick == 3) {
      t.cancel();
      gata.complete();
    }
  });
  await gata.future;
  print('Start!');
}

Rezultat

tick 1: mai sunt 2
tick 2: mai sunt 1
tick 3: mai sunt 0
Start!

Exemplul 2: Salvare automată, oprită din afară

import 'dart:async';

Future<void> main() async {
  var salvari = 0;
  final autosalvare = Timer.periodic(const Duration(milliseconds: 20), (_) => salvari++);
  await Future.delayed(const Duration(milliseconds: 110));
  autosalvare.cancel();
  print('Salvări făcute: cel puțin 3? ${salvari >= 3}');
  print('Timer activ: ${autosalvare.isActive}');
}

Rezultat

Salvări făcute: cel puțin 3? true
Timer activ: false

Greșeli frecvente

  • Uiți să oprești timer-ul periodic. Programul nu se mai termină, pentru că timer-ul ține bucla de evenimente ocupată.

Comenzi înrudite

  • Timer: Rulează o funcție o dată, după o durată dată; cancel îl oprește înainte, isActive spune dacă mai așteaptă.
  • Stream.periodic: Creează un stream infinit care emite o valoare la fiecare interval de timp, calculată din numărul pasului.
  • Timer.run: Rulează o funcție cât mai curând, ca eveniment nou, după codul curent și după microtask-uri (Timer cu durata zero).