特点
-
[SafetyTime] 是一款旨在阻止在短时间内多次调用的定时锁。它的工作方式类似于同步互斥锁([锁定]和[解锁])。[SafetyTime] 适用于 Flutter。它可以避免 `嵌套` 和 `状态管理` 的问题。
-
[SafetyTime] 提供了两个核心函数
- 第一个是防止用户重复点击、重复网络请求等。例如,在多选列表中,用户同时触摸多个选项。又例如,在网络请求时,用户再次点击以发起请求。具体来说,[SafetyTime] 会比较两次调用之间的时间间隔,如果小于安全间隔 [SafetyTime],则该事件将被丢弃。
- 第二个是一对与 [lock] 和 [unlock] 类似的方法,它们是 [tryLockForever] 和 [unlockForever]。具体来说,[SafetyTime] 会将一个 [key] 永久锁定,直到用户手动调用 [unlockForever] 解锁。
入门
添加依赖
您可以使用命令将 dio 添加为依赖项,并使用最新的稳定版本
$ dart pub add flutter_safety_time
或者,您也可以在 pubspec.yaml 文件的 dependencies 部分手动添加 dio
dependencies:
flutter_safety_time:
用法
用户在推送新页面之前点击了多个按钮。
onATap: {
if(SafetyTime.unavailable) return;
Navigator.push(context, PageA());
}
onBTap: {
if(SafetyTime.unavailable) return;
Navigator.push(context, PageB());
}
限制一分钟内仅登录一次。
loginRequest() async {
if(SafetyTime.unavailableOf('Login', Duration(seconds: 1))) {
alert('Limit onece login in 1 minute.');
return;
}
await Login();
alert('success');
}
[SafetyTime.tryLockForever] 可以长时间锁定 [key]。当 [key] 被锁定后,[unavailable] 和 [unavailableOf] 都会返回 true,但 [synchronizedKey] 不会受到影响。
updateUserInfo() async {
if(SafetyTime.tryLockForever('UpdateUserInfo')) {
await doSomething();
SafetyTime.unlockForever('UpdateUserInfo');
}
}
InPageA {
updateUserInfo();
}
InPageB {
updateUserInfo();
}
同步 key 当锁可用时执行 [computation]。在保留锁时,一次只能运行一个异步块。如果指定了 [timeout],它将尝试获取锁,并且不会调用 computation 回调,如果无法在给定的时间内获取锁,则会抛出 [TimeoutExpection]。
save(x) {
await SafetyTime.synchronizedKey('WritToFile', (userInfo) async {
writToFile(x);
});
}
InPageA() {
... ...
save(A);
... ...
}
InPageB() {
... ...
save(B);
... ...
}
附加信息
- 2023