Future<T> whenComplete(
dynamic action()
)

Register a function to be called when this future completes.

The action function is called when this future completes, whether it does so with a value or with an error.

This is the asynchronous equivalent of a "finally" block.

The future returned by this call, f, will complete the same way as this future unless an error occurs in the action call, or in a Future returned by the action call. If the call to action does not return a future, its return value is ignored.

If the call to action throws, then f is completed with the thrown error.

If the call to action returns a Future, f2, then completion of f is delayed until f2 completes. If f2 completes with an error, that will be the result of f too. The value of f2 is always ignored.

This method is equivalent to:

Future<T> whenComplete(action()) {
  return this.then((v) {
    var f2 = action();
    if (f2 is Future) return f2.then((_) => v);
    return v
  }, onError: (e) {
    var f2 = action();
    if (f2 is Future) return f2.then((_) { throw e; });
    throw e;
  });
}

Source

/**
 * Register a function to be called when this future completes.
 *
 * The [action] function is called when this future completes, whether it
 * does so with a value or with an error.
 *
 * This is the asynchronous equivalent of a "finally" block.
 *
 * The future returned by this call, `f`, will complete the same way
 * as this future unless an error occurs in the [action] call, or in
 * a [Future] returned by the [action] call. If the call to [action]
 * does not return a future, its return value is ignored.
 *
 * If the call to [action] throws, then `f` is completed with the
 * thrown error.
 *
 * If the call to [action] returns a [Future], `f2`, then completion of
 * `f` is delayed until `f2` completes. If `f2` completes with
 * an error, that will be the result of `f` too. The value of `f2` is always
 * ignored.
 *
 * This method is equivalent to:
 *
 *     Future<T> whenComplete(action()) {
 *       return this.then((v) {
 *         var f2 = action();
 *         if (f2 is Future) return f2.then((_) => v);
 *         return v
 *       }, onError: (e) {
 *         var f2 = action();
 *         if (f2 is Future) return f2.then((_) { throw e; });
 *         throw e;
 *       });
 *     }
 */
Future<T> whenComplete(action());