J'aimerais exécuter une fonction plusieurs fois, avec un délai entre les deux. Comment puis-je faire cela avec Dart ?
Réponses
Trop de publicités?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.
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();
}
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'));
}
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();
});
}
- Réponses précédentes
- Plus de réponses