Je voudrais exécuter une fonction encore et encore, avec un délai entre les deux. Comment puis-je faire cela avec Dart?
Vous pouvez utiliser la classe Timer
pour planifier des fonctions ponctuelles et répétitives.
Voici comment exécuter une fonction répétitive:
import 'Dart:async';
main() {
const oneSec = const Duration(seconds:1);
new 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 rappel doit prendre un seul paramètre, le temporisateur lui-même.
Utilisez timer.cancel()
pour annuler une minuterie répétée. C'est l'une des raisons pour lesquelles le temporisateur est passé à l'exécution de rappel à partir d'un temporisateur répétitif.
Pour planifier une fonction ponctuelle après un délai (exécuter une fois, dans le futur):
import 'Dart:async';
main() {
const twentyMillis = const Duration(milliseconds:20);
new Timer(twentyMillis, () => print('hi!'));
}
Notez que le rappel pour un temporisateur à un coup ne prend pas de paramètre.
Vous pouvez également demander qu'une fonction soit exécutée dès que possible, au moins une boucle d'événement à l'avenir.
import 'Dart:async';
main() {
Timer.run(() => print('hi!'));
}
Les minuteries fonctionnent même en HTML. En fait, window.setTimeout
A été supprimé, donc Timer est le seul moyen d'exécuter une fonction à l'avenir.
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 requis juste
import 'Dart:async';
StreamSubscription periodicSub;
void main() {
periodicSub = new Stream.periodic(const Duration(milliseconds: 500))
.take(10)
.listen((_) => print('tick'));
}
Vous pouvez également utiliser Future.delayed et attendre 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');
}
alternative;
Timer interval(Duration duration, func) {
Timer function() {
Timer timer = new Timer(duration, function);
func(timer);
return timer;
}
return new Timer(duration, function);
}
int i = 0;
interval(new Duration(seconds: 1), (timer) {
print(i++);
if (i > 5) timer.cancel();
});
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êtez de n'importe quelle fonction
isStopped = true;
Pour vous débarrasser, 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();
}