Files
retail/lib/core/utils/debouncer.dart
Phuoc Nguyen b94c158004 runable
2025-10-10 16:38:07 +07:00

103 lines
2.2 KiB
Dart

/// Performance utility for debouncing rapid function calls
///
/// Use cases:
/// - Search input (300ms delay before search)
/// - Auto-save functionality
/// - API request rate limiting
/// - Scroll position updates
import 'dart:async';
import 'package:flutter/foundation.dart';
/// Debouncer utility to prevent excessive function calls
///
/// Example usage:
/// ```dart
/// final searchDebouncer = Debouncer(milliseconds: 300);
///
/// void onSearchChanged(String query) {
/// searchDebouncer.run(() {
/// performSearch(query);
/// });
/// }
/// ```
class Debouncer {
final int milliseconds;
Timer? _timer;
Debouncer({required this.milliseconds});
/// Run the action after the debounce delay
void run(VoidCallback action) {
_timer?.cancel();
_timer = Timer(Duration(milliseconds: milliseconds), action);
}
/// Cancel any pending debounced action
void cancel() {
_timer?.cancel();
}
/// Dispose of the debouncer
void dispose() {
_timer?.cancel();
}
}
/// Throttler utility to limit function call frequency
///
/// Example usage:
/// ```dart
/// final scrollThrottler = Throttler(milliseconds: 100);
///
/// void onScroll() {
/// scrollThrottler.run(() {
/// updateScrollPosition();
/// });
/// }
/// ```
class Throttler {
final int milliseconds;
Timer? _timer;
bool _isReady = true;
Throttler({required this.milliseconds});
/// Run the action only if throttle period has passed
void run(VoidCallback action) {
if (_isReady) {
_isReady = false;
action();
_timer = Timer(Duration(milliseconds: milliseconds), () {
_isReady = true;
});
}
}
/// Cancel throttler
void cancel() {
_timer?.cancel();
_isReady = true;
}
/// Dispose of the throttler
void dispose() {
_timer?.cancel();
}
}
/// Search-specific debouncer with common configuration
class SearchDebouncer extends Debouncer {
SearchDebouncer() : super(milliseconds: 300);
}
/// Auto-save debouncer with longer delay
class AutoSaveDebouncer extends Debouncer {
AutoSaveDebouncer() : super(milliseconds: 1000);
}
/// Scroll throttler for performance
class ScrollThrottler extends Throttler {
ScrollThrottler() : super(milliseconds: 100);
}