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