Return a result ErrorOr with either a value T or an error Object.


Always return a value ErrorOr from an async function. Let the called function handle the error and return an ErrorOr. The caller can then await the result without a try catch.

A subclass of ErrorOr contains either the expected value T or an error Object (usually an Exception returned from a try catch).

Internally, we create a private subclass of ErrorOr, either a _ValueWrapper or an _ErrorWrapper, with the expected non-null value.

ErrorOr can be used for non-async functions too – for both Flutter and Dart.

Getting started

Make a function return a Future<ErrorOr>, which you’ll await in the calling function.

Create a ErrorOr instance by calling one of its factory constructors value or error.

Check hasError or hasValue, before calling error or value. If either is called without the proper check, a ErrorOrTypeError is thrown.



Future<ErrorOr<LocationPermission>> checkPermission() async {
  try {
    return ErrorOr.value(await Geolocator.checkPermission());
  } catch (e) {
    return ErrorOr.error(e);
ErrorOr<LocationPermission> errorOrPermission = await checkPermission();
if (errorOrPermission.hasError) {
  return errorOrPermission;
LocationPermission permission = errorOrPermission.value;

Additional information

I would like to keep this package minimal, but please get in touch on github if you have suggestions to improvements.

The name was inspired by the ErrorOr type of SerenityOS.

The Success / Failure pattern was inspired by result_type.


View Github