Timer în Dart

Rulează o funcție o dată, după o durată dată; cancel îl oprește înainte, isActive spune dacă mai așteaptă.

Sintaxă
import 'dart:async';

Timer(Duration duration, void callback())
void cancel()
bool get isActive

Ce face Timer

Timer(durata, f) programează funcția f să ruleze o singură dată, după durata. Programul nu se oprește în timpul așteptării: codul de după merge mai departe, iar funcția rulează din bucla de evenimente.

cancel() anulează un timer care nu a rulat încă (sau oprește unul periodic). isActive este true cât timp timer-ul încă așteaptă; după ce a rulat sau a fost anulat devine false.

Diferența față de Future.delayed: timer-ul poate fi anulat, dar nu dă un future pe care să-l aștepți.

Parametri

Parametru Descriere
duration După cât timp rulează funcția.
callback Funcția rulată.

Ce returnează

Un obiect Timer.

Exemple

Exemplul 1: Mesaj întârziat și isActive

import 'dart:async';

Future<void> main() async {
  final t = Timer(const Duration(milliseconds: 50), () => print('Cafeaua este gata!'));
  print('Am pornit espressorul, activ: ${t.isActive}');
  await Future.delayed(const Duration(milliseconds: 100));
  print('După: activ = ${t.isActive}');
}

Rezultat

Am pornit espressorul, activ: true
Cafeaua este gata!
După: activ = false

Exemplul 2: Căutare cu întârziere (debounce)

Fiecare literă nouă anulează timer-ul anterior; căutarea pornește doar după ce utilizatorul s-a oprit din scris.

import 'dart:async';

Timer? _cautare;

void laTastare(String text) {
  _cautare?.cancel();
  _cautare = Timer(const Duration(milliseconds: 40), () => print('Caut: "$text"'));
}

Future<void> main() async {
  for (final text in ['I', 'Ia', 'Ias', 'Iasi']) {
    laTastare(text);
    await Future.delayed(const Duration(milliseconds: 10));
  }
  await Future.delayed(const Duration(milliseconds: 100));
  print('Activ după căutare: ${_cautare!.isActive}');
}

Rezultat

Caut: "Iasi"
Activ după căutare: false

Greșeli frecvente

  • Crezi că Timer blochează programul. Nu blochează; funcția rulează mai târziu, iar main poate termina înainte dacă nu mai așteaptă nimic.
  • Pierzi referința la timer și nu-l mai poți anula. Păstrează-l într-o variabilă dacă s-ar putea să trebuiască oprit.

Comenzi înrudite

  • Timer.periodic: Rulează o funcție la fiecare interval de timp, până la cancel; tick numără câte intervale au trecut.
  • 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).
  • Future.delayed: Creează un future care se termină după o durată dată, opțional cu valoarea unei funcții; pauza asincronă din Dart.
  • Stream.periodic: Creează un stream infinit care emite o valoare la fiecare interval de timp, calculată din numărul pasului.