Builders Academy
Dart — Le langage de Flutter
3 of 3

Chapitre 2 · Leçon 1

Futures & Streams

Gérer l'asynchrone et les flux de données

Section 1

Future — valeur unique asynchrone

Step 1

async/await avec Future

Future<T> représente une valeur qui sera disponible dans le futur. async/await permet d'écrire du code asynchrone de façon synchrone — identique à JavaScript.

snippet.dart

dart
1import 'dart:convert';
2import 'package:http/http.dart' as http;
3
4// Future<T> — valeur asynchrone unique
5Future<List<Tutorial>> fetchTutorials() async {
6  try {
7    final response = await http.get(
8      Uri.parse('https://api.usher.dev/tutorials'),
9    );
10
11    if (response.statusCode != 200) {
12      throw Exception('Erreur HTTP : ${response.statusCode}');
13    }
14
15    final List<dynamic> json = jsonDecode(response.body)['data'];
16    return json.map((e) => Tutorial.fromJson(e)).toList();
17
18  } on SocketException {
19    throw Exception('Pas de connexion Internet');
20  }
21}
22
23// FutureBuilder dans Flutter
24FutureBuilder<List<Tutorial>>(
25  future: fetchTutorials(),
26  builder: (context, snapshot) {
27    if (snapshot.connectionState == ConnectionState.waiting) {
28      return const CircularProgressIndicator();
29    }
30    if (snapshot.hasError) {
31      return Text('Erreur : ${snapshot.error}');
32    }
33    final tutorials = snapshot.data!;
34    return ListView.builder(
35      itemCount: tutorials.length,
36      itemBuilder: (_, i) => TutorialTile(tutorial: tutorials[i]),
37    );
38  },
39)

Step 2

Stream — flux de données continues

Un Stream<T> émet plusieurs valeurs dans le temps. Parfait pour Firebase Realtime, WebSockets, ou la progression d'un téléchargement.

snippet.dart

dart
1import 'dart:convert';
2import 'package:http/http.dart' as http;
3
4// Future<T> — valeur asynchrone unique
5Future<List<Tutorial>> fetchTutorials() async {
6  try {
7    final response = await http.get(
8      Uri.parse('https://api.usher.dev/tutorials'),
9    );
10
11    if (response.statusCode != 200) {
12      throw Exception('Erreur HTTP : ${response.statusCode}');
13    }
14
15    final List<dynamic> json = jsonDecode(response.body)['data'];
16    return json.map((e) => Tutorial.fromJson(e)).toList();
17
18  } on SocketException {
19    throw Exception('Pas de connexion Internet');
20  }
21}
22
23// FutureBuilder dans Flutter
24FutureBuilder<List<Tutorial>>(
25  future: fetchTutorials(),
26  builder: (context, snapshot) {
27    if (snapshot.connectionState == ConnectionState.waiting) {
28      return const CircularProgressIndicator();
29    }
30    if (snapshot.hasError) {
31      return Text('Erreur : ${snapshot.error}');
32    }
33    final tutorials = snapshot.data!;
34    return ListView.builder(
35      itemCount: tutorials.length,
36      itemBuilder: (_, i) => TutorialTile(tutorial: tutorials[i]),
37    );
38  },
39)

Topics and skills covered

  • Dart
  • Future
  • Stream
  • async/await