mirror of
https://github.com/immich-app/immich.git
synced 2024-12-26 10:50:29 +02:00
27488ceb67
* dep(mobile): update flutter and deps * chore: dart analyzer * chore: update flutter workflow version * chore: dart format * fix: gallery_viewer PopScope --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
62 lines
1.4 KiB
Dart
62 lines
1.4 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
|
|
|
/// Used to debounce function calls with the [interval] provided.
|
|
class Debouncer {
|
|
Debouncer({required this.interval});
|
|
final Duration interval;
|
|
Timer? _timer;
|
|
FutureOr<void> Function()? _lastAction;
|
|
|
|
void run(FutureOr<void> Function() action) {
|
|
_lastAction = action;
|
|
_timer?.cancel();
|
|
_timer = Timer(interval, _callAndRest);
|
|
}
|
|
|
|
void _callAndRest() {
|
|
_lastAction?.call();
|
|
_timer = null;
|
|
}
|
|
|
|
void dispose() {
|
|
_timer?.cancel();
|
|
_timer = null;
|
|
_lastAction = null;
|
|
}
|
|
}
|
|
|
|
/// Creates a [Debouncer] that will be disposed automatically. If no [interval] is provided, a
|
|
/// default interval of 300ms is used to debounce the function calls
|
|
Debouncer useDebouncer({
|
|
Duration interval = const Duration(milliseconds: 300),
|
|
List<Object?>? keys,
|
|
}) =>
|
|
use(_DebouncerHook(interval: interval, keys: keys));
|
|
|
|
class _DebouncerHook extends Hook<Debouncer> {
|
|
const _DebouncerHook({
|
|
required this.interval,
|
|
super.keys,
|
|
});
|
|
|
|
final Duration interval;
|
|
|
|
@override
|
|
HookState<Debouncer, Hook<Debouncer>> createState() => _DebouncerHookState();
|
|
}
|
|
|
|
class _DebouncerHookState extends HookState<Debouncer, _DebouncerHook> {
|
|
late final debouncer = Debouncer(interval: hook.interval);
|
|
|
|
@override
|
|
Debouncer build(_) => debouncer;
|
|
|
|
@override
|
|
void dispose() => debouncer.dispose();
|
|
|
|
@override
|
|
String get debugLabel => 'useDebouncer';
|
|
}
|