Line data Source code
1 : // ignore_for_file: avoid_print
2 :
3 : /// Log levels used by [DebouncerLogger].
4 : enum DebouncerLogLevel {
5 : /// Only log when an action fires.
6 : fire,
7 :
8 : /// Log fire and cancel events.
9 : verbose,
10 :
11 : /// Log everything including timer resets.
12 : debug,
13 : }
14 :
15 : /// Optional logger you can attach to a [Debouncer] for debugging.
16 : ///
17 : /// In release builds you should either omit the logger or set
18 : /// [enabled] to `false` to avoid any performance overhead.
19 : ///
20 : /// Example:
21 : /// ```dart
22 : /// final debouncer = Debouncer(
23 : /// delay: Duration(milliseconds: 300),
24 : /// logger: DebouncerLogger(level: DebouncerLogLevel.verbose),
25 : /// );
26 : /// ```
27 : class DebouncerLogger {
28 : /// The minimum log level to output.
29 : final DebouncerLogLevel level;
30 :
31 : /// Whether logging is active. Defaults to `true` in debug mode.
32 : final bool enabled;
33 :
34 : /// Optional prefix prepended to every log line.
35 : final String prefix;
36 :
37 1 : const DebouncerLogger({
38 : this.level = DebouncerLogLevel.verbose,
39 : this.enabled = true,
40 : this.prefix = '[Debouncer]',
41 : });
42 :
43 1 : void logFire(String? label) {
44 1 : if (!enabled) return;
45 2 : _log('▶ fired${label != null ? ' ($label)' : ''}');
46 : }
47 :
48 1 : void logCancel(String? label) {
49 3 : if (!enabled || level == DebouncerLogLevel.fire) return;
50 2 : _log('✕ cancelled${label != null ? ' ($label)' : ''}');
51 : }
52 :
53 1 : void logReset(String? label, Duration delay) {
54 3 : if (!enabled || level != DebouncerLogLevel.debug) return;
55 3 : _log('↺ reset${label != null ? ' ($label)' : ''} — next fire in ${delay.inMilliseconds}ms');
56 : }
57 :
58 4 : void _log(String message) => print('$prefix $message');
59 : }
|