95 votes

Comment exécuter une fonction récurrente, en Dart ?

J'aimerais exécuter une fonction plusieurs fois, avec un délai entre les deux. Comment puis-je faire cela avec Dart ?

196voto

Seth Ladd Points 13589

Vous pouvez utiliser le Timer pour programmer des fonctions ponctuelles et répétitives.

Répétant

Voici comment exécuter une fonction répétitive :

import 'dart:async';
main() {
  const oneSec = Duration(seconds:1);
  Timer.periodic(oneSec, (Timer t) => print('hi!'));
}

Le Timer prend deux arguments, une durée et une fonction à exécuter. La durée doit être une instance de Duration . Le callback doit prendre un seul paramètre, le timer lui-même.

Annulation d'une minuterie répétitive

Utilice timer.cancel() pour annuler une minuterie répétitive. C'est l'une des raisons pour lesquelles le timer est passé à la callback exécutée à partir d'un timer répétitif.


One-shot après un délai

Pour programmer une fonction ponctuelle après un délai (exécuter une fois, un certain temps dans le futur) :

import 'dart:async';
main() {
  const twentyMillis = Duration(milliseconds:20);
  Timer(twentyMillis, () => print('hi!'));
}

Remarquez que le rappel pour une minuterie à un coup ne prend pas de paramètre.


One-shot dès que possible

Vous pouvez également demander qu'une fonction soit exécutée le plus tôt possible, au moins un tick de boucle d'événement dans le futur.

import 'dart:async';
main() {
  Timer.run(() => print('hi!'));
}

En HTML

Les minuteurs fonctionnent même en HTML. En effet, window.setTimeout a été supprimé, de sorte que Timer est le seul moyen d'exécuter une fonction à l'avenir.

32voto

Exemple de minuterie de 5 secondes

bool isStopped = false; //global

sec5Timer() {
  Timer.periodic(Duration(seconds: 5), (timer) {
    if (isStopped) {
      timer.cancel();
    }
    print("Dekhi 5 sec por por kisu hy ni :/");
  });
}

Appel depuis n'importe quelle fonction

sec5Timer(); 

Arrêt à partir de n'importe quelle fonction

isStopped = true;

Pour disposer, vous pouvez utiliser ce code ou cette technique.

 @override
  void initState() {
    _timer = new Timer.periodic(widget.refreshRate, 
      (Timer timer) => _updateDisplayTime(inheritedWidget));
    super.initState();
  }

  @override
  void dispose() {
    _timer.cancel();
    super.dispose();
  }

19voto

Günter Zöchbauer Points 21340

https://api.dartlang.org/stable/1.24.3/dart-async/Stream/Stream.periodic.html

import 'dart:async';

StreamSubscription periodicSub;

void main() {
  periodicSub = new Stream.periodic(const Duration(milliseconds: 500), (v) => v)
      .take(10)
      .listen((count) => print('tick $count'));
}

ou si le compteur n'est pas nécessaire, il suffit de

import 'dart:async';

StreamSubscription periodicSub;

void main() {
  periodicSub = new Stream.periodic(const Duration(milliseconds: 500))
      .take(10)
      .listen((_) => print('tick'));
}

8voto

Matt S. Points 1723

Vous pouvez également utiliser Future.delayed et await pour retarder l'exécution :

Future<Null> delay(int milliseconds) {
  return new Future.delayed(new Duration(milliseconds: milliseconds));
}

main() async {
  await delay(500);
  print('Delayed 500 milliseconds');
}

4voto

Ahmet Şimşek Points 355

alternative ;

import 'dart:async';

Timer interval(Duration duration, func) {
  Timer function() {
    Timer timer = new Timer(duration, function);

    func(timer);

    return timer;
  }

  return new Timer(duration, function);
}

void main() {
  int i = 0;

  interval(new Duration(seconds: 1), (timer) {
    print(i++);

    if (i > 5) timer.cancel();
  });
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X