速率限制器
速率限制是一种限制操作的策略。它会限制一个人在特定时间段内重复执行某项操作的次数。使用 rate_limiter,我们比以往任何时候都更容易将这些策略应用于常规的 dart 函数。
安装
将以下内容添加到您的 pubspec.yaml 文件中,并将 [version] 替换为最新版本
dependencies:
rate_limiter: ^[version]
策略
防抖
防抖函数 将忽略所有对它的调用,直到调用停止一段时间。只有到那时,它才会调用原始函数。例如,如果我们指定时间为两秒,并且防抖函数在每两次调用之间间隔一秒的情况下被调用 10 次,那么在最后一次(第十次)调用之后两秒钟之前,该函数都不会调用原始函数。
用法
使用 rate_limiter 创建防抖函数非常简单
- 从头开始创建
final debouncedFunction = debounce((String value) {
print('Got value : $value');
return value;
}, const Duration(seconds: 2));
- 将现有函数转换为防抖函数
String regularFunction(String value) {
print('Got value : $value');
return value;
}
final debouncedFunction = regularFunction.debounced(
const Duration(seconds: 2),
);
示例
通常,搜索框会提供下拉列表,为用户当前输入提供自动完成选项。有时,建议的选项是通过 API 从后端获取的(例如,在 Google Maps 中)。自动完成 API 会在搜索查询更改时被调用。如果没有防抖,您每输入一个字母就会调用一次 API,即使您输入得非常快。通过一秒的防抖,可以确保自动完成函数在用户停止输入一秒后才执行任何操作。
final debouncedAutocompleteSearch = debounce(
(String searchQuery) async {
// fetches results from the api
final results = await searchApi.get(searchQuery);
// updates suggestion list
updateSearchSuggestions(results);
},
const Duration(seconds: 1),
);
TextField(
onChanged: (query) {
debouncedAutocompleteSearch([query]);
},
);
节流
节流 函数意味着确保函数在指定的时间段内最多只被调用一次(例如,每 10 秒一次)。这意味着节流会防止函数在“最近”运行后再次运行。节流还能确保函数以固定的速率规律地运行。
用法
创建节流函数与创建防抖函数类似
- 从头开始创建
final throttledFunction = throttle((String value) {
print('Got value : $value');
return value;
}, const Duration(seconds: 2));
- 将现有函数转换为节流函数
String regularFunction(String value) {
print('Got value : $value');
return value;
}
final throttledFunction = regularFunction.throttled(
const Duration(seconds: 2),
);
示例
在动作游戏中,用户通常通过按下按钮来执行一个关键动作(例如,射击、挥拳)。但是,任何游戏玩家都知道,用户可能会因为动作的兴奋和强度而比必要时按更多次按钮。因此,用户可能在 5 秒内按下“挥拳”按钮 10 次,但游戏角色每秒只能挥出一拳。在这种情况下,对动作进行节流是有意义的。在这种情况下,将“挥拳”动作节流到每秒一次将忽略每秒的第二次按钮按下。
final throttledPerformPunch = throttle(
() {
print('Performed one punch to the opponent');
},
const Duration(seconds: 1),
);
RaisedButton(
onPressed: (){
throttledPerformPunch();
}
child: Text('Punch')
);
挂起
用于检查是否还有函数需要调用。
final pending = debouncedFunction.isPending;
final pending = throttledFunction.isPending;
刷新
用于立即调用所有剩余的延迟函数。
final result = debouncedFunction.flush();
final result = throttledFunction.flush();
取消
用于取消所有剩余的延迟函数。
debouncedFunction.cancel();
throttledFunction.cancel();