df_debouncer 0.5.0
df_debouncer: ^0.5.0 copied to clipboard
A package that provides a practical Debouncer for optimizing performance by controlling the frequency of function calls in response to rapid events.
Summary #
Lightweight building blocks for controlling the rate of function calls in response to rapid events:
Debouncer— delays running an action until things have been quiet for a chosen window. Supports leading-edge (onStart), per-call (onCall), and trailing-edge (onWaited) callbacks, plusfinalize()to flush a pending wait anddispose()to abandon it.Throttle— runs an action at most once per cool-down window. Ships with presets for common refresh rates (Throttle24Hz,Throttle30Hz,Throttle48Hz,Throttle60Hz,Throttle120Hz) andThrottleImmediatefor no-op throttling.CacheManager<T>— a small in-memory cache with optional per-entry expiration. Re-caching a key cancels its previous expiration timer, so values are never silently evicted by a stale timer.
Installation #
dart pub add df_debouncer
# or, for a Flutter project:
flutter pub add df_debouncer
Usage #
Debouncer #
import 'package:df_debouncer/df_debouncer.dart';
final autosave = Debouncer(
delay: const Duration(milliseconds: 500),
onStart: () => print('Saving...'), // first call in a burst
onCall: () => print('Form changed'), // every call
onWaited: () => print('Saved to db'), // 500ms after the last call
);
// Trigger from rapid events:
autosave();
autosave();
autosave();
// Flush a pending wait right now (e.g. in dispose):
await autosave.finalize();
// Or drop the pending wait without running onWaited:
autosave.dispose();
Throttle #
final throttle = Throttle60Hz(); // at most ~60 calls per second
void onPointerMove(Offset p) {
throttle.run(() => repaint(p));
}
// Clear the cool-down early:
throttle.cancel();
CacheManager #
final cache = CacheManager<String>();
cache.cache('greeting', 'hello', cacheDuration: const Duration(minutes: 5));
final greeting = cache['greeting']; // 'hello' (or null once expired)
cache.remove('greeting');
cache.clear();
🔍 For more information, refer to the API reference.
💬 Contributing and Discussions #
This is an open-source project, and we warmly welcome contributions from everyone, regardless of experience level. Whether you're a seasoned developer or just starting out, contributing to this project is a fantastic way to learn, share your knowledge, and make a meaningful impact on the community.
☝️ Ways you can contribute #
- Find us on Discord: Feel free to ask questions and engage with the community here: https://discord.gg/gEQ8y2nfyX.
- Share your ideas: Every perspective matters, and your ideas can spark innovation.
- Help others: Engage with other users by offering advice, solutions, or troubleshooting assistance.
- Report bugs: Help us identify and fix issues to make the project more robust.
- Suggest improvements or new features: Your ideas can help shape the future of the project.
- Help clarify documentation: Good documentation is key to accessibility. You can make it easier for others to get started by improving or expanding our documentation.
- Write articles: Share your knowledge by writing tutorials, guides, or blog posts about your experiences with the project. It's a great way to contribute and help others learn.
No matter how you choose to contribute, your involvement is greatly appreciated and valued!
☕ We drink a lot of coffee... #
If you're enjoying this package and find it valuable, consider showing your appreciation with a small donation. Every bit helps in supporting future development. You can donate here: https://www.buymeacoffee.com/dev_cetera
LICENSE #
This project is released under the MIT License. See LICENSE for more information.