JSON Okuma
Coddy'nin Flutter Journey'sinin Veri ve Ağ bölümünün bir parçası. Ders 15 / 27.
Sunucular nadiren düz bir cümleyle yanıt verir. JSON gönderirler: verileri içeren, adları tırnak içinde ve değerleri iki noktadan sonra gelen metin. Deneme API'sindeki /user şu yanıtı verir:
{
"name": "Maya Chen",
"email": "maya@example.com",
"age": 28,
"isPro": true
}Uygulaman için bu, uzun bir String'dir. Dart'ın dart:convert kütüphanesindeki jsonDecode, bu metni Dart değerlerine dönüştürür. Süslü parantezler bir Map olur: adlar, bu haritanın anahtarlarıdır.
import 'dart:convert';
final Map<String, dynamic> user = jsonDecode(body);
print(user['name']); // Maya ChenAnahtarlar her zaman dizelerdir. Değerler metin, sayılar, true veya false, listeler ya da başka haritalar olabilir; bu nedenle türleri dynamic'dir: "herhangi bir tür, uygulama çalışırken belirlenir". Anahtarlar birebir eşleşir: user['Name'], user['name'] ile aynı değildir ve eksik bir anahtar null verir.
Ekranın kullanıma hazır veriler alması için yanıtı, veriyi aldığın yerde, kendi işlevinde çözümle.
Görev
OrtaProfil ekranı ham JSON verisini gösteriyor. Bunun yerine kişiyi göster:
loadUser, birFuture<Map<String, dynamic>>döndürür:fetch('/user')çağrısını bekler ve gövdeninjsonDecodesonucunu döndürür (dart:convertiçe aktar)_userveFutureBuilderda aynı türü kullanır- veri geldiğinde,
user['name'](boyut 28, kalın) ve altındauser['email']bulunan birColumngöster
Kendin dene
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();
},
),
),
);
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Veri ve Ağ bölümündeki tüm dersler
3Çağrılar Başarısız Olduğunda
try ile Hataları YakalamaHata Fırlatmafinally ile TemizlemeFutureBuilder Hata DurumuYeniden Dene DüğmesiKendi başına pratik yap: Online Flutter derleyicisi