useMutation<TData, TVariables> function

MutationResult<TData, TVariables> useMutation<TData, TVariables>({
  1. required MutatorFn<TData, TVariables> mutator,
  2. int retry = 0,
  3. RetryDelayFn? retryDelay,
  4. RetryWhenFn? retryWhen,
  5. OnMutateFn<TVariables>? onMutate,
  6. OnMutationSuccessFn<TData, TVariables>? onSuccess,
  7. OnMutationErrorFn<TVariables>? onError,
  8. OnMutationSettledFn<TData, TVariables>? onSettled,
})

A hook that returns a mutation object to perform requests and track their state.

Implementation

MutationResult<TData, TVariables> useMutation<TData, TVariables>({
  required MutatorFn<TData, TVariables> mutator,
  int retry = 0,
  RetryDelayFn? retryDelay,
  RetryWhenFn? retryWhen,
  OnMutateFn<TVariables>? onMutate,
  OnMutationSuccessFn<TData, TVariables>? onSuccess,
  OnMutationErrorFn<TVariables>? onError,
  OnMutationSettledFn<TData, TVariables>? onSettled,
}) {
  final options = useMemoized(
    () => MutationOptions<TData, TVariables>(
      mutator: mutator,
      retry: retry,
      retryDelay: retryDelay,
      retryWhen: retryWhen,
      onMutate: onMutate,
      onSuccess: onSuccess,
      onError: onError,
      onSettled: onSettled,
    ),
    [retry],
  );

  final mutation = useMemoized(
      () => Mutation<TData, TVariables>(options: options), [options]);
  final state =
      useState<MutationResult<TData, TVariables>>(mutation.currentResult);

  useEffect(() {
    final subscription = mutation.stream.listen((result) {
      state.value = result;
    });

    return () {
      subscription.cancel();
      mutation.dispose();
    };
  }, [mutation]);

  return state.value;
}