Meterwhite / flutter_safety_time

A timelock.Block mutiple taps.Block another call within the interval.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Features

  • [SafetyTime] is a timelock which designed to block multiple calls within an interval. It works like a synchronized mutex ([lock] and [unlock]).

  • [SafetyTime] provides two cor functions:

    • The first is to block users from repeated clicks, repeated network requests, etc.For example, in a multi-select list, the user touches multiple options at the same time.As another example, when the network requests, the user clicks again to request. Specifically, [SafetyTime] will compare the interval between two times,and if it is less than the safe interval [SafetyTime], the event will be discarded.
    • The second is a pair of methods similar to [lock] and [unlock], they are [tryLockForever] and [unlockForever]. Specifically, [SafetyTime] will lock a indefinitely [key] until the user manually calls [unlockForever] to unlock the lock.

Getting started

Add dependency

You can use the command to add flutter_safety_time as a dependency with the latest stable version:

$ dart pub add flutter_safety_time

Or you can manually add flutter_safety_time into the dependencies section in your pubspec.yaml:

dependencies:
  flutter_safety_time:

Usage

The user taped multiple buttons before the new page was pushed.

onATap: {
  if(SafetyTime.unavailable) return;
  ... ...
  Navigator.push(context, PageA());
}

onBTap: {
  if(SafetyTime.unavailable) return;
  ... ...
  Navigator.push(context, PageB());
}

Limit onece login in 1 minute.

loginRequest() async {
    if(SafetyTime.unavailableOf('Login', Duration(minutes: 1))) {
        alert('Limit onece login in 1 minute.');
        return;
    }
    await login();
    alert('success');
}

[SafetyTime.tryLockForever] can lock [key] for a long time. When [key] is locked, both [unavailable] and [unavailableOf] return true, but [synchronizedKey] is not affected.

updateUserInfo() async {
    // Make calls to "updateUserInfo" unique within the same time period.
    if(SafetyTime.tryLockForever('UpdateUserInfo')) {
      await doSomething();
      SafetyTime.unlockForever('UpdateUserInfo');
    }
}

InPageA {
  ... ...
  updateUserInfo(); // Called at any time
  ... ...
}

InPageB {
  ... ...
  updateUserInfo(); // Called at any time
  ... ...
}

Synchronous key Executes [computation] when lock is available. Only one asynchronous block can run while the key is retained. If [timeout] is specified, it will try to grab the lock and will not call the computation callback and throw a [TimeoutExpection] is the lock cannot be grabbed in the given duration.

save(x) {
  await SafetyTime.synchronizedKey('WritToFile', (userInfo) async {
    writToFile(x);
  });
}

InPageA {
  ... ...
  save(A); // Called at any time
  ... ...
}

InPageB {
  ... ...
  save(B); // Called at any time
  ... ...
}

Additional information

  • Click 'StaršŸ‘' to bookmark this library, which you can find in your profile.
  • Github

About

A timelock.Block mutiple taps.Block another call within the interval.

License:MIT License


Languages

Language:Dart 100.0%