Giá trị JSON và as
Thuộc phần Dữ liệu và mạng trong hành trình Flutter của Coddy. Bài học 16 trên 27.
Một giá trị trong map JSON có kiểu dynamic. Dart không biết giá trị đó là gì, nên không kiểm tra cách bạn sử dụng nó, và trình chỉnh sửa cũng không thể giúp bạn. Bạn biết máy chủ gửi gì: age là một số, isPro là true hoặc false. Hãy khai báo kiểu đó bằng as:
final age = user['age'] as int;
final isPro = user['isPro'] as bool;as kiểm tra giá trị ngay tại đó. Từ đó trở đi, age là một int và isPro là một bool, Dart sẽ xử lý chúng theo các kiểu đó. Nếu máy chủ gửi một giá trị khác, ứng dụng sẽ lỗi ngay tại dòng đó và thông báo sẽ nêu tên cả hai kiểu, thay vì báo lỗi ở một nơi nào đó rất xa.
Các giá trị JSON tương ứng với những kiểu Dart như sau: văn bản đặt trong dấu ngoặc kép là String, số nguyên là int, số có dấu chấm là double, còn true hoặc false là bool. Lưu ý rằng true không có dấu ngoặc kép: đó là bool, không phải văn bản 'true'.
Thử thách
Trung bìnhHiển thị thêm thông tin hồ sơ. Trong builder, đọc từng giá trị bằng as: name và email dưới dạng String, age dưới dạng int, isPro dưới dạng bool. Sau đó, thêm bên dưới email:
28 years old, tạo từagePro memberkhiisProlà true vàFree plankhi không phải
Tự làm thử
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();
},
),
),
);
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Dữ liệu và mạng
Tự luyện tập: Trình biên dịch Flutter online