JSON'dan Bir Liste
Coddy'nin Flutter Journey'sinin Veri ve Ağ bölümünün bir parçası. Ders 18 / 27.
Birçok yanıt liste biçimindedir: tüm kitaplar, tüm mesajlar, bir tahmindeki her gün. JSON'da liste köşeli parantezlerle yazılır ve burada her öğe bir nesnedir:
[
{"title": "Frankenstein", "author": "Mary Shelley"},
{"title": "Pride and Prejudice", "author": "Jane Austen"}
]jsonDecode köşeli parantezleri bir List hâline getirir. Öğeleri de dynamic türünde olduğundan, as ile ne beklediğini belirt: liste için List<dynamic>, her öğe için Map<String, dynamic>.
Ardından map ile her öğeyi bir Book hâline getir ve sonuçları toList() ile bir araya getir:
final items = jsonDecode(body) as List<dynamic>;
return items
.map((item) => Book.fromJson(item as Map<String, dynamic>))
.toList();Tek başına map, bir List değil, tembel bir Iterable verir; bu yüzden toList() kullanılır. Böylece ekranda ListView.builder için bir List<Book> bulunur.
Görev
OrtaRaf yalnızca ilk kitabı gösteriyor. loadBooks işlevinin, items.map(...) ve .toList() kullanarak listedeki her öğeyi bir Book'a dönüştürmesini sağla.
Kendin dene
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: BooksScreen(),
);
}
}
class BooksScreen extends StatefulWidget {
const BooksScreen({super.key});
@override
State<BooksScreen> createState() => _BooksScreenState();
}
class _BooksScreenState extends State<BooksScreen> {
late Future<List<Book>> _books;
@override
void initState() {
super.initState();
_books = loadBooks();
}
Future<List<Book>> loadBooks() async {
final body = await fetch('/books');
final items = jsonDecode(body) as List<dynamic>;
return [Book.fromJson(items[0] as Map<String, dynamic>)];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Books')),
body: FutureBuilder<List<Book>>(
future: _books,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(child: Text('Could not load: ${snapshot.error}'));
}
if (snapshot.hasData) {
final books = snapshot.data!;
return ListView.builder(
itemCount: books.length,
itemBuilder: (context, index) {
final book = books[index];
return ListTile(
title: Text(book.title),
subtitle: Text(book.author),
);
},
);
}
return const Center(child: CircularProgressIndicator());
},
),
);
}
}
class Book {
Book({required this.title, required this.author});
final String title;
final String author;
factory Book.fromJson(Map<String, dynamic> json) {
return Book(
title: json['title'] as String,
author: json['author'] as String,
);
}
}
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