Setelah pelajaran ini kamu bisa membaca fungsi pengambil data yang memeriksa statusCode, mengubah body JSON menjadi objek model dengan factory fromJson, dan memprediksi galat tipe saat JSON tidak sesuai.
±13 menit
3 latihan
Diperiksa 28 Okt 2026
Latihan di pelajaran ini butuh akun gratis. Progres, kode, dan catatanmu hanya tersimpan di browser ini. Masuk untuk menyimpannya
Materi
Aplikasi Flutter mengambil data dari server dengan paket http, yang ditambahkan lewat flutter pub add http. Konsep HTTP sendiri, seperti metode GET, kode status, dan header, dibahas di kelas HTTP dan API Web; di sini fokusnya sisi Dart. http.get(Uri.parse(alamat)) mengembalikan Future<http.Response> yang berisi statusCode dan body berupa teks. Resep resmi Flutter memeriksa statusCode == 200 lebih dulu, dan untuk kode lain, termasuk 404, melempar Exception alih-alih mengembalikan null.
class Cabang {
final String kode;
final String kota;
final bool buka24Jam;
const Cabang({required this.kode, required this.kota, required this.buka24Jam});
factory Cabang.fromJson(Map<String, dynamic> json) {
return Cabang(
kode: json['kode'] as String,
kota: json['kota'] as String,
buka24Jam: json['buka24Jam'] as bool,
);
}
}
Future<Cabang> ambilCabang(String kode) async {
final respons = await http.get(Uri.parse('https://api.toko.example/cabang/$kode'));
if (respons.statusCode == 200) {
return Cabang.fromJson(jsonDecode(respons.body) as Map<String, dynamic>);
}
throw Exception('Gagal memuat cabang $kode (${respons.statusCode})');
}
jsonDecode dari dart:convert mengubah teks JSON menjadi objek Dart: objek JSON menjadi Map<String, dynamic> dan larik JSON menjadi List<dynamic>. Karena nilainya dynamic, kelas model memakai factory fromJson yang membaca setiap kunci dan menegaskan tipenya dengan as. Bila JSON tidak sesuai, misalnya angka dikirim sebagai teks, galatnya muncul saat berjalan tepat di cast as, bukan saat analisis. Salah ketik nama kunci juga baru ketahuan saat berjalan, karena kunci Map tidak diperiksa analyzer.
Latihan
0/3 lulus
Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.
Latihan 1 dari 3
Apa yang dicetak program ini?
class Produk {
final int id;
final String nama;
final int harga;
final bool tersedia;
const Produk({
required this.id,
required this.nama,
required this.harga,
required this.tersedia,
});
factory Produk.fromJson(Map<String, dynamic> json) {
return Produk(
id: json['id'] as int,
nama: json['nama'] as String,
harga: json['harga'] as int,
tersedia: json['tersedia'] as bool,
);
}
}
void main() {
const body = '{"id": 7, "nama": "Kopi Susu", "harga": 18000, "tersedia": false}';
final p = Produk.fromJson(jsonDecode(body) as Map<String, dynamic>);
print('${p.nama} ${p.harga} ${p.tersedia ? 'ada' : 'habis'}');
}
Latihan 2 dari 3
Server mengirim harga sebagai teks. Apa yang terjadi saat program ini dijalankan?
class Produk {
final int id;
final String nama;
final int harga;
final bool tersedia;
const Produk({
required this.id,
required this.nama,
required this.harga,
required this.tersedia,
});
factory Produk.fromJson(Map<String, dynamic> json) {
return Produk(
id: json['id'] as int,
nama: json['nama'] as String,
harga: json['harga'] as int,
tersedia: json['tersedia'] as bool,
);
}
}
void main() {
const body = '{"id": 8, "nama": "Teh Tarik", "harga": "15000", "tersedia": true}';
final p = Produk.fromJson(jsonDecode(body) as Map<String, dynamic>);
print(p.harga);
}
Latihan 3 dari 3
Body berisi larik JSON. Ekspresi mana yang menggantikan /* ... */ sehingga program mencetak 2?
class Produk {
final int id;
final String nama;
final int harga;
final bool tersedia;
const Produk({
required this.id,
required this.nama,
required this.harga,
required this.tersedia,
});
factory Produk.fromJson(Map<String, dynamic> json) {
return Produk(
id: json['id'] as int,
nama: json['nama'] as String,
harga: json['harga'] as int,
tersedia: json['tersedia'] as bool,
);
}
}
void main() {
const body = '[{"id": 1, "nama": "Teh", "harga": 5000, "tersedia": true}, '
'{"id": 2, "nama": "Kopi", "harga": 8000, "tersedia": false}]';
final List<Produk> daftar = /* ... */;
print(daftar.length);
}