Using a Future with then, catchError, async, and await will be enough for most use cases, but there is another way to deal with asynchronous programming in Dart and Flutter: the Completer class.
Completer creates Future objects that you can complete later with a value or an error. We will be using Completer in this recipe.