2024-05-23 18:10:34 +08:00
|
|
|
|
import 'dart:async';
|
|
|
|
|
|
|
|
|
|
|
|
import 'package:star_lock/app_settings/app_settings.dart';
|
|
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
|
/// 节流器 可以防止一个函数在短时间内被重复调用
|
|
|
|
|
|
// 创建一个1秒的节流器
|
|
|
|
|
|
// Throttler throttler = Throttler(Duration(seconds: 1));
|
|
|
|
|
|
//
|
|
|
|
|
|
// // 示例函数
|
|
|
|
|
|
// void myFunction() {
|
|
|
|
|
|
// print("函数被调用");
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// // 调用示例函数,会在1秒内只输出一次
|
|
|
|
|
|
// throttler.throttle(myFunction);
|
|
|
|
|
|
//
|
|
|
|
|
|
// // 在自定义时间间隔内防止函数被重复调用
|
|
|
|
|
|
// Throttler customThrottler = Throttler(Duration(milliseconds: 500)); // 自定义500毫秒的间隔
|
|
|
|
|
|
// customThrottler.throttle(myFunction); // 在500毫秒内多次调用只会执行一次函数
|
|
|
|
|
|
//
|
|
|
|
|
|
// // 在需要时取消节流器
|
|
|
|
|
|
// customThrottler.cancel(); // 取消节流器,函数再次被调用会立即执行
|
|
|
|
|
|
|
|
|
|
|
|
class Throttler {
|
|
|
|
|
|
Throttler(this._delay);
|
|
|
|
|
|
|
|
|
|
|
|
final Duration _delay;
|
|
|
|
|
|
Timer? _timer;
|
|
|
|
|
|
late Function _callback;
|
|
|
|
|
|
|
|
|
|
|
|
void throttle(Function callback) {
|
|
|
|
|
|
if (_timer == null || !_timer!.isActive) {
|
|
|
|
|
|
_callback = callback;
|
|
|
|
|
|
_timer = Timer(_delay, () {
|
|
|
|
|
|
_callback();
|
|
|
|
|
|
_timer?.cancel();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void cancel() {
|
|
|
|
|
|
_timer?.cancel();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
|
/// 防止抖动
|
|
|
|
|
|
///
|
|
|
|
|
|
class FunctionBlocker {
|
|
|
|
|
|
FunctionBlocker({required this.duration});
|
|
|
|
|
|
|
|
|
|
|
|
bool _blocked = false;
|
|
|
|
|
|
Duration duration;
|
|
|
|
|
|
|
2024-05-23 18:43:41 +08:00
|
|
|
|
//阻止函数执行
|
2024-05-23 18:10:34 +08:00
|
|
|
|
void block(Function function) {
|
|
|
|
|
|
if (!_blocked) {
|
|
|
|
|
|
_blocked = true;
|
|
|
|
|
|
function();
|
|
|
|
|
|
Timer(duration, () {
|
|
|
|
|
|
_blocked = false;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//倒计时禁止
|
|
|
|
|
|
void countdownProhibited({required Duration duration}) {
|
|
|
|
|
|
_blocked = true;
|
|
|
|
|
|
Timer(duration, () {
|
|
|
|
|
|
_blocked = false;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|