Monday, October 30, 2023

Mastering Asynchronous Programming in Flutter with FutureOr and Future

Table of Contents

Chapter 1: Asynchronous Programming and Flutter

Asynchronous programming is an essential part of modern application development. It helps improve user experience, maintain app responsiveness, and handle complex tasks in the background. The Dart language and Flutter framework provide various tools to handle such async operations.

The Dart language has a built-in Future class to easily handle async computations. A Future represents a promise that a value will be available in the future. This value may not have been computed yet or is not available immediately.

Flutter also leverages Dart's Future class to compose and manage the UI. For example, when fetching data from a network call, you can wait until the operation completes before updating the UI accordingly.

In this chapter, we'll explore the async programming techniques used with Flutter. In the next chapter, we'll learn more about FutureOr which appears together with Future.

Back to top

Chapter 2: Understanding Futures in Flutter

One of the key concepts for understanding asynchronous programming in Flutter is 'Futures'. A Future is a core Dart class that represents a promise that a result will be available 'in the future'.

For example, when requesting data from a server, the response is not returned immediately. With Futures, you can continue performing other work while waiting for the response. This maintains your app's responsiveness.


Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 5));
  return 'Hello, World!'; 
}

The above code is an async function that waits 5 seconds before returning the string 'Hello, World!'. The return type is declared as Future<String>, indicating it will return a String value in the future.

But what if the function fails or errors before returning properly? Or what if it needs to return multiple values?

The answers lie in 'FutureOr', which we'll cover in the next chapter.

Back to top

Chapter 3: Introducing FutureOr

Futures are a great tool in Dart for representing async operations. But sometimes a function needs to return either a Future<T> or a T value directly. This is where 'FutureOr' comes in.

FutureOr<T> can directly return a value of type T, or return a Future<T> that will provide a value in the future. This allows a function to either synchronously return a result immediately, or asynchronously return a result later.

  
void printString(FutureOr<String> value) {
  if (value is Future<String>) {
    value.then((str) => print(str));
  } else if (value is String) {
    print(value);
  }
}

The above function accepts either a Future<String> or String, waits on the Future if needed, and prints the result.

This shows how Flutter leverages both 'Future' and 'FutureOr' to elegantly handle complex async logic. Let's look at real examples next.

Back to top

Chapter 4: Applying Futures and FutureOr with Examples

In this chapter, we'll see how Future and FutureOr can be applied in a real Flutter app.

Consider the task of fetching data from a network API call. This is an asynchronous operation that takes time. We also need to update the app UI based on the API result.


Future<String> fetchDataFromNetwork() async {
  await Future.delayed(Duration(seconds: 5)); // Simulate network delay
  return 'Data from network';
}

void updateUI(FutureOr<String> data) {
  if (data is Future) {
    data.then((value) => print('Update UI with $value'));
  } else if (data is String) {
    print('Update UI with $data');
  }
}  

void main() {
  var data = fetchDataFromNetwork();
  updateUI(data);
}
  

The 'fetchDataFromNetwork' function fetches data asynchronously from the network. It returns a 'Future<String>'. The 'updateUI' function then accepts this value to update the UI.

The parameter type of 'updateUI' is 'FutureOr<String>'. So it can directly accept a string, or a Future that will resolve to a string later. If the parameter is a Future, it uses the then() method to wait until the operation completes before updating the UI.

Back to top

Conclusion: Futures and FutureOr - The Best Tools for Asynchronous Programming

Asynchronous programming is an essential part of modern application development. Dart and Flutter provide powerful tools like Future and FutureOr to facilitate this.

Futures represent operations that will return a value 'in the future', allowing you to maintain app responsiveness while handling time-consuming tasks. FutureOr allows a function to either return a result synchronously or asynchronously.

We looked at how to leverage these tools to implement effective asynchronous programming in Flutter. These techniques help simplify complex async logic and improve code readability.

Back to top

0 개의 댓글:

Post a Comment