DeepSource has joined Harness. Learn more
Dart Analyze logoDart Analyze/
DRT-W1437

Incompatible return type in `Future.catchError` invocationDRT-W1437

Major severityMajor
Bug Risk categoryBug Risk

The analyzer produces this diagnostic when an invocation of Future.catchError has an argument whose return type isn't compatible with the type returned by the instance of Future. At runtime, the method catchError attempts to return the value from the callback as the result of the future, which results in another exception being thrown.

Examples

The following code produces this diagnostic because future is declared to return an int while callback is declared to return a String, and String isn't a subtype of int:

void f(Future<int> future, String Function(dynamic, StackTrace) callback) {
  future.catchError(callback);
}

The following code produces this diagnostic because the closure being passed to catchError returns an int while future is declared to return a String:

void f(Future<String> future) {
  future.catchError((error, stackTrace) => 3);
}

Common fixes

If the instance of Future is declared correctly, then change the callback to match:

void f(Future<int> future, int Function(dynamic, StackTrace) callback) {
  future.catchError(callback);
}

If the declaration of the instance of Future is wrong, then change it to match the callback:

void f(Future<String> future, String Function(dynamic, StackTrace) callback) {
  future.catchError(callback);
}