Understanding the Difference Between Async and Async* in Dart

Understanding the Difference Between Async and Async* in Dart

19 December 2024 Stephan Petzl Leave a comment Tech-Help

In the world of Dart programming, particularly when working with the Flutter framework, understanding asynchronous operations is crucial. Two keywords that often arise in this context are async and async*. Both are essential for handling asynchronous code, but they serve different purposes. This guide will explain the key differences and provide practical examples to help you choose the right approach for your needs.

What is Async?

The async keyword is used in functions that perform tasks that might take some time to complete. It returns a Future, which represents a potential value or error that will be available at some later time. This is particularly useful for operations like file reading, database querying, or API calls, where you want to avoid blocking the execution of your program while waiting for the result.

Future doSomeLongTask() async {
  await Future.delayed(const Duration(seconds: 1));
  return 42;
}

main() async {
  int result = await doSomeLongTask();
  print(result); // prints '42' after waiting 1 second
}

In this example, the function doSomeLongTask waits for a second before returning the result, which is then awaited in the main function.

What is Async*?

The async* keyword is used when you want to return a sequence of values over time, encapsulated in a Stream. This is known as an asynchronous generator function. Instead of returning a single value like async, async* yields multiple values over time, which can be particularly useful for scenarios where you want to process data as it arrives.

Stream countForOneMinute() async* {
  for (int i = 1; i <= 60; i++) {
    await Future.delayed(const Duration(seconds: 1));
    yield i;
  }
}

main() async {
  await for (int i in countForOneMinute()) {
    print(i); // prints 1 to 60, one integer per second
  }
}

Here, the countForOneMinute function generates a stream of numbers from 1 to 60, emitting one number per second.

Choosing Between Async and Async*

  • Use async when you need to perform a single asynchronous operation that returns a single result.
  • Use async* when you need to work with a series of asynchronous results over time, such as processing data streams.

Further Exploration

For more detailed insights into working with asynchronous operations in Flutter, you might find these articles helpful:

Leveraging Repeato for Automated Testing

When developing mobile applications, ensuring the reliability of asynchronous operations is vital. This is where automated testing tools like Repeato can prove invaluable. As a no-code test automation tool for iOS and Android, Repeato allows you to create, run, and maintain automated tests for your apps with ease. By leveraging computer vision and AI, Repeato ensures that your Flutter apps perform well under various conditions, helping you catch issues early in the development process. For more information on how Repeato can streamline your testing workflow, visit our Flutter Test Automation page.

Like this article? there’s more where that came from!