| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- import 'dart:async';
- import 'package:flutter/foundation.dart';
- enum LimitMode {
- debounce, //防抖
- throttle, //节流
- }
- class ActionLimiter {
- final int milliseconds;
- final LimitMode mode;
- Timer? _debounceTimer;
- DateTime? _lastActionTime;
- ActionLimiter({
- this.milliseconds = 300,
- this.mode = LimitMode.debounce,
- });
- void run(VoidCallback action) {
- if (mode == LimitMode.debounce) {
- // 防抖:只执行最后一次
- _debounceTimer?.cancel();
- _debounceTimer = Timer(Duration(milliseconds: milliseconds), action);
- } else if (mode == LimitMode.throttle) {
- // 节流:间隔内只执行一次
- final now = DateTime.now();
- if (_lastActionTime == null ||
- now.difference(_lastActionTime!) >
- Duration(milliseconds: milliseconds)) {
- _lastActionTime = now;
- action();
- }
- }
- }
- void dispose() {
- _debounceTimer?.cancel();
- }
- }
|