特点

  • [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

GitHub

查看 Github