関数を何度も繰り返し実行したいのですが、間に遅延があります。 Dartでこれを行うにはどうすればよいですか?
Timer
クラスを使用して、ワンショット関数と繰り返し関数をスケジュールできます。
繰り返し関数を実行する方法は次のとおりです。
_import 'Dart:async';
main() {
const oneSec = const Duration(seconds:1);
new Timer.periodic(oneSec, (Timer t) => print('hi!'));
}
_
Timerは、期間と実行する関数の2つの引数を取ります。期間はDuration
のインスタンスでなければなりません。コールバックは単一のパラメーター(タイマー自体)を取る必要があります。
繰り返しタイマーをキャンセルするには、timer.cancel()
を使用します。これが、タイマーが繰り返しタイマーから実行されるコールバックに渡される1つの理由です。
遅延後にワンショット機能をスケジュールするには(一度実行して、後で実行します):
_import 'Dart:async';
main() {
const twentyMillis = const Duration(milliseconds:20);
new Timer(twentyMillis, () => print('hi!'));
}
_
ワンショットタイマーのコールバックはパラメーターを取りません。
また、関数をできるだけ早く実行するように要求することもできます。少なくとも1つのイベントループティックが将来は実行されます。
_import 'Dart:async';
main() {
Timer.run(() => print('hi!'));
}
_
タイマーはHTMLでも機能します。実際、_window.setTimeout
_は削除されたので、Timerは将来関数を実行する唯一の方法です。
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'));
}
または、カウンターが不要な場合
import 'Dart:async';
StreamSubscription periodicSub;
void main() {
periodicSub = new Stream.periodic(const Duration(milliseconds: 500))
.take(10)
.listen((_) => print('tick'));
}
Future.delayedを使用して、実行を遅らせることもできます。
Future<Null> delay(int milliseconds) {
return new Future.delayed(new Duration(milliseconds: milliseconds));
}
main() async {
await delay(500);
print('Delayed 500 milliseconds');
}
代替;
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();
});
5秒タイマーの例
bool isStopped = false; //global
sec5Timer() {
Timer.periodic(Duration(seconds: 5), (timer) {
if (isStopped) {
timer.cancel();
}
print("Dekhi 5 sec por por kisu hy ni :/");
});
}
任意の関数からの呼び出し
sec5Timer();
すべての機能から停止
isStopped = true;
処分するには、このコードまたは手法を使用できます。
@override
void initState() {
_timer = new Timer.periodic(widget.refreshRate,
(Timer timer) => _updateDisplayTime(inheritedWidget));
super.initState();
}
@override
void dispose() {
_timer.cancel();
super.dispose();
}