useAsyncCallbackDedup<T> function

Future<T?> Function() useAsyncCallbackDedup<T>(
  1. Future<T> block(),
  2. List<Object?> keys
)

Implementation

Future<T?> Function() useAsyncCallbackDedup<T>(
  Future<T> Function() block,
  List<Object?> keys,
) {
  final cur = useRef<Future<T>?>(null);

  final cb = useCallback(
    () {
      if (cur.value != null) {
        return Future<T?>.value();
      }

      cur.value = block();
      return cur.value!.whenComplete(() => cur.value = null);
    },
    keys,
  );

  return cb;
}