Dart
Async/Await and Futures
Asynchronous programming with Future and async/await.
By EZ4Code Team
asyncfuturestream
Code
Future<String> fetchUser(int id) async {
await Future.delayed(Duration(seconds: 1));
return 'user-$id';
}
Future<List<String>> fetchUsers(List<int> ids) async {
// Parallel: wait for all
final results = await Future.wait(ids.map(fetchUser));
return results;
}
Future<void> main() async {
// Single await
final user = await fetchUser(1);
print(user); // user-1
// Parallel
final users = await fetchUsers([1, 2, 3]);
print(users); // [user-1, user-2, user-3]
// Error handling
try {
final data = await fetchData();
} catch (e) {
print('Error: $e');
}
// Future.then (alternative)
fetchUser(2).then((u) => print(u)).catchError((e) => print(e));
}
// Stream (multiple async values)
Stream<int> counter(int max) async* {
for (var i = 0; i < max; i++) {
await Future.delayed(Duration(milliseconds: 100));
yield i;
}
}Explanation
async/await is sugar over Futures — the function is rewritten to return a Future. Future.wait runs futures in parallel (like Promise.all). async* defines a generator that yields a Stream — use await for to consume. Streams are Dart's reactive primitive (like Observables). Always mark async functions with async; errors propagate as rejected Futures.
More Dart Snippets
Classes and Constructors
Define classes with named and factory constructors.
Collections (List, Map, Set)
Work with collections and functional operations.
Null Safety
Sound null safety with ? and ! operators.
Generics
Type-safe reusable classes and methods.
Mixins and Extensions
Compose behaviors without inheritance.
Futures and Streams
Work with single and multiple async values.