103 lines
2.2 KiB
Dart
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);
|
|
}
|