Chapitre 2 · Leçon 1
Gérer l'asynchrone et les flux de données
Section 1
Step 1
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
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
Un Stream<T> émet plusieurs valeurs dans le temps. Parfait pour Firebase Realtime, WebSockets, ou la progression d'un téléchargement.