JSON и класс модели в Flutter
Тело HTTP-ответа в формате JSON превращают
в структуры Dart функцией jsonDecode
из dart:convert. Она возвращает
dynamic - Map или List, с которыми
удобнее работать через свой класс.
У модели делают фабрику fromJson,
которая читает ключи Map. Список на экране
строят через
ListView.builder
по длине массива:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
void main() {
runApp(const MaterialApp(home: JsonListPage()));
}
class Todo {
Todo({required this.id, required this.title});
final int id;
final String title;
factory Todo.fromJson(Map<String, dynamic> json) {
return Todo(
id: json['id'] as int, // JSON types may differ
title: json['title'] as String,
);
}
}
class JsonListPage extends StatefulWidget {
const JsonListPage({super.key});
@override
State<JsonListPage> createState() => _JsonListPageState();
}
class _JsonListPageState extends State<JsonListPage> {
late Future<List<Todo>> todos;
@override
void initState() {
super.initState();
todos = loadTodos();
}
Future<List<Todo>> loadTodos() async {
final uri = Uri.parse('https://jsonplaceholder.typicode.com/todos?_limit=5');
final response = await http.get(uri);
if (response.statusCode != 200) {
throw Exception('Load error');
}
final raw = jsonDecode(response.body) as List<dynamic>;
return raw
.map((item) => Todo.fromJson(item as Map<String, dynamic>))
.toList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('JSON')),
body: FutureBuilder<List<Todo>>(
future: todos,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
}
if (snapshot.hasError) {
return Center(child: Text('${snapshot.error}'));
}
final items = snapshot.data!;
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
final todo = items[index];
return ListTile(
title: Text(todo.title),
subtitle: Text('id: ${todo.id}'),
);
},
);
},
),
);
}
}
Загрузите список пользователей с
jsonplaceholder, сделайте класс
User с name и email.
В ListTile покажите имя и почту.