Valeurs JSON et as
Fait partie de la section Données et réseau du Journey Flutter de Coddy. Leçon 16 sur 27.
Une valeur provenant d’une map JSON est dynamic. Dart ne sait pas de quoi il s’agit, donc il ne vérifie pas ce que tu en fais, et l’éditeur ne peut pas t’aider. Tu sais ce que le serveur envoie : age est un nombre, isPro est true ou false. Indique-le avec as :
final age = user['age'] as int;
final isPro = user['isPro'] as bool;as vérifie la valeur à cet endroit. À partir de là, age est un int et isPro est un bool, et Dart les traite comme tels. Si le serveur a envoyé autre chose, l’application échoue sur cette ligne avec un message qui nomme les deux types, plutôt qu’à un endroit éloigné.
Les valeurs JSON correspondent aux types Dart comme suit : un texte entre guillemets est une String, un nombre entier est un int, un nombre avec une virgule est un double, et true ou false est un bool. Note que true n’a pas de guillemets : c’est un bool, pas le texte 'true'.
Défi
MoyenAffiche plus d’informations sur le profil. Dans le constructeur, lis chaque valeur avec as : name et email en tant que String, age en tant que int, isPro en tant que bool. Ensuite, sous l’adresse e-mail, ajoute :
28 years old, construit à partir deagePro memberlorsqueisProest true, etFree plandans le cas contraire
Essayez vous-même
import 'dart:convert';
import 'package:flutter/material.dart';
import 'api.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: ProfileScreen(),
);
}
}
class ProfileScreen extends StatefulWidget {
const ProfileScreen({super.key});
@override
State<ProfileScreen> createState() => _ProfileScreenState();
}
class _ProfileScreenState extends State<ProfileScreen> {
late Future<Map<String, dynamic>> _user;
@override
void initState() {
super.initState();
_user = loadUser();
}
Future<Map<String, dynamic>> loadUser() async {
final body = await fetch('/user');
return jsonDecode(body);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Profile')),
body: Center(
child: FutureBuilder<Map<String, dynamic>>(
future: _user,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('Could not load: ${snapshot.error}');
}
if (snapshot.hasData) {
final user = snapshot.data!;
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
user['name'],
style: const TextStyle(fontSize: 28, fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
Text(user['email'], style: const TextStyle(fontSize: 18)),
],
);
}
return const CircularProgressIndicator();
},
),
),
);
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Données et réseau
1Futures
Une valeur qui arrive plus tardAttendre avec async et awaitFonctions qui renvoient des FuturesL’API d’entraînement de Coddy4JSON
Lire du JSONValeurs JSON et asUn constructeur fromJsonUne liste à partir de JSONChamps JSON manquantsEntraînez-vous par vous-même : Compilateur Flutter en ligne