· 5 years ago · Nov 18, 2020, 08:32 PM
1import 'dart:async';
2import 'dart:convert';
3import 'package:flutter/material.dart';
4import 'package:http/http.dart' as http;
5
6class Dog {
7 final int id;
8 final String name;
9 final int age;
10
11 Dog({this.id, this.name, this.age});
12
13 // Método que cria um objeto Dog a partir de um JSON recebido.
14 factory Dog.fromJson(Map<String, dynamic> json) {
15 return Dog(
16 id: json['dogId'],
17 name: json['name'],
18 age: json['age'],
19 );
20 }
21}
22
23// Método que realiza a leitura de um Dog da API.
24Future<Dog> fetchDog() async {
25 //Insira aqui a URL do endpoint da API.
26 final response =
27 await http.get('https://5fb5817d36e2fa00166a462d.mockapi.io/dogs/1');
28
29 if (response.statusCode == 200) {
30 // Se o servidor retornou uma resposta 200 OK
31 // converte a resposta (JSON) para um objeto da classe Dog.
32 return Dog.fromJson(jsonDecode(response.body));
33 }
34 // Caso o servidor tenha retornado erro lança uma exceção.
35 else {
36 throw Exception('Falha ao carregar dados da API!');
37 }
38}
39
40void main() => runApp(MyApp());
41
42class MyApp extends StatefulWidget {
43 MyApp({Key key}) : super(key: key);
44
45 @override
46 _MyAppState createState() => _MyAppState();
47}
48
49class _MyAppState extends State<MyApp> {
50 Future<Dog> futureDog;
51
52 @override
53 void initState() {
54 super.initState();
55 futureDog = fetchDog();
56 }
57
58 @override
59 Widget build(BuildContext context) {
60 return MaterialApp(
61 title: 'Exemplo - Read API',
62 theme: ThemeData(
63 primarySwatch: Colors.blue,
64 ),
65 home: Scaffold(
66 appBar: AppBar(
67 title: Text('Exemplo - Read API'),
68 ),
69 body: Center(
70 child: FutureBuilder<Dog>(
71 future: futureDog,
72 builder: (context, snapshot) {
73 // Caso a API tenha retornado dados.
74 if (snapshot.hasData) {
75 // Exibe na vertical três componentes text com os dados
76 return Column(children: <Widget>[
77 Padding(
78 padding: EdgeInsets.all(20),
79 child: Text(snapshot.data.id.toString())),
80 Padding(
81 padding: EdgeInsets.all(20),
82 child: Text(snapshot.data.name)),
83 Padding(
84 padding: EdgeInsets.all(20),
85 child: Text(snapshot.data.age.toString()))
86 ]);
87 }
88 // Caso a API não tenha retornado os dados, mas sim lançado uma exceção.
89 else if (snapshot.hasError) {
90 return Text("${snapshot.error}");
91 }
92 // Mostra spinner enquanto carrega a requisição.
93 return CircularProgressIndicator();
94 },
95 ),
96 ),
97 ),
98 );
99 }
100}