概念
節(jié)流是忽略操作芹彬,在觸發(fā)事件時(shí)蓄髓,立即執(zhí)行目標(biāo)操作,如果在指定的時(shí)間區(qū)間內(nèi)再次觸發(fā)了事件舒帮,則會(huì)丟棄該事件不執(zhí)行会喝,只有超過(guò)了指定的時(shí)間之后,才會(huì)再次觸發(fā)事件玩郊。
防抖是延時(shí)操作肢执,在觸發(fā)事件時(shí),不立即執(zhí)行目標(biāo)操作译红,而是給出一個(gè)延遲的時(shí)間预茄,如果在指定的時(shí)間區(qū)間內(nèi)再次觸發(fā)了事件,則重置延時(shí)時(shí)間侦厚,只有當(dāng)延時(shí)時(shí)間走完了才會(huì)真正執(zhí)行耻陕。
使用 Extension + Timer + 閉包函數(shù)
1. 擴(kuò)展Function,添加節(jié)流功能
extension ThrottleExtension on Function {
void Function() throttle([int milliseconds = 500]) {
bool _isAllowed = true;
Timer? _throttleTimer;
return () {
if (!_isAllowed) return;
_isAllowed = false;
this();
_throttleTimer?.cancel();
_throttleTimer = Timer(Duration(milliseconds: milliseconds), () {
_isAllowed = true;
});
};
}
}
2. 擴(kuò)展Function刨沦,添加防抖功能
extension DebounceExtension on Function {
void Function() debounce([int milliseconds = 500]) {
Timer? _debounceTimer;
return () {
if (_debounceTimer?.isActive ?? false) _debounceTimer?.cancel();
_debounceTimer = Timer(Duration(milliseconds: milliseconds), this);
};
}
}
使用閉包函數(shù)诗宣,維護(hù)內(nèi)部局部變量 timer
使用方式
//點(diǎn)擊事件
onPressed: () {
setState(() {
_counter++;
});
}.throttle()