forked from liftoff-app/liftoff
-
Notifications
You must be signed in to change notification settings - Fork 0
/
delayed_loading.dart
42 lines (37 loc) · 1.06 KB
/
delayed_loading.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
class DelayedLoading {
final bool pending;
final bool loading;
final VoidCallback start;
final VoidCallback cancel;
const DelayedLoading({
required this.pending,
required this.loading,
required this.start,
required this.cancel,
});
}
/// When loading is [.start()]ed, it goes into a pending state
/// and loading is triggered after [delayDuration].
/// Everything can be reset with [.cancel()]
DelayedLoading useDelayedLoading(
[Duration delayDuration = const Duration(milliseconds: 500)]) {
final loading = useState(false);
final pending = useState(false);
final timerHandle = useRef<Timer?>(null);
return DelayedLoading(
loading: loading.value,
pending: pending.value,
start: () {
timerHandle.value = Timer(delayDuration, () => loading.value = true);
pending.value = true;
},
cancel: () {
timerHandle.value?.cancel();
pending.value = false;
loading.value = false;
},
);
}