JSON lesen
Teil des Abschnitts Daten und Netzwerk der Flutter-Journey von Coddy. Lektion 15 von 27.
Server antworten selten mit einem einfachen Satz. Sie senden JSON: Text, der Daten enthält, mit Namen in Anführungszeichen und Werten nach einem Doppelpunkt. Die Übungs-API unter /user antwortet so:
{
"name": "Maya Chen",
"email": "maya@example.com",
"age": 28,
"isPro": true
}Für deine App ist das ein langer String. jsonDecode aus der Dart-Bibliothek dart:convert wandelt diesen Text in Dart-Werte um. Geschweifte Klammern werden zu einer Map: Die Namen sind ihre Schlüssel.
import 'dart:convert';
final Map<String, dynamic> user = jsonDecode(body);
print(user['name']); // Maya ChenDie Schlüssel sind immer Zeichenfolgen. Die Werte können Text, Zahlen, true oder false, Listen oder weitere Maps sein. Deshalb ist ihr Typ dynamic: „jeder Typ, der während der Ausführung der App festgelegt wird“. Schlüssel müssen genau übereinstimmen: user['Name'] ist nicht user['name'], und ein fehlender Schlüssel ergibt null.
Wandle die Antwort dort um, wo du sie abrufst, und zwar in einer eigenen Funktion, damit der Bildschirm sofort verwendbare Daten erhält.
Aufgabe
MittelDer Profilbildschirm zeigt das rohe JSON. Zeige stattdessen die Person an:
loadUsergibt einFuture<Map<String, dynamic>>zurück: Es wartet auffetch('/user')und gibtjsonDecodedes Bodys zurück (importieredart:convert)_userund derFutureBuilderverwenden ebenfalls diesen Typ- wenn die Daten eintreffen, zeige eine
Columnmituser['name'](Größe 28, fett) und darunteruser['email']
Probier es selbst
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<String> _user;
@override
void initState() {
super.initState();
_user = loadUser();
}
Future<String> loadUser() async {
return fetch('/user');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Profile')),
body: Center(
child: FutureBuilder<String>(
future: _user,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('Could not load: ${snapshot.error}');
}
if (snapshot.hasData) {
return Text(snapshot.data!);
}
return const CircularProgressIndicator();
},
),
),
);
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Daten und Netzwerk
2Ladebildschirme
Ein Spinner während des LadensFutureBuilder kennenlernenEinmalig in initState ladenDaten per Button neu ladenZum Aktualisieren nach unten ziehen5Datumsangaben und Preise
Datumsangaben mit DateFormatUhrzeiten mit DateFormatPreise mit NumberFormatÜbe selbstständig: Online-Flutter-Compiler