· 3 years ago · Oct 29, 2021, 02:20 PM
1import 'package:flutter/material.dart';
2import 'package:dropdown_search/dropdown_search.dart';
3import 'package:uni_clima/model/clima_model.dart';
4import 'package:http/http.dart' as http;
5import 'dart:convert';
6
7import 'package:uni_clima/widgets/clima_widget.dart';
8
9class Home extends StatefulWidget {
10 const Home({Key? key}) : super(key: key);
11
12 @override
13 _HomeState createState() => _HomeState();
14}
15
16class _HomeState extends State<Home> {
17 late ClimaModel climaModel;
18 bool isLoading = false;
19 final List<String> _cidades = [
20 "Aracaju",
21 "Belém",
22 "Belo Horizonte",
23 "Boa Vista",
24 "Brasilia",
25 "Campo Grande",
26 "Cuiaba",
27 "Curitiba",
28 "Florianopolis",
29 "Fortaleza",
30 "Goiânia",
31 "João Pessoa",
32 "Macapá",
33 "Maceió",
34 "Manaus",
35 "Natal",
36 "Palmas",
37 "Porto Alegre",
38 "Porto Velho",
39 "Recife",
40 "Rio Branco",
41 "Rio de Janeiro",
42 "Salvador",
43 "São Luiz",
44 "São Paulo",
45 "Teresina",
46 "Vitória"
47 ];
48
49 String _cidadeSelecionada = "São Paulo";
50
51
52 @override
53 void initState() {
54 super.initState();
55 carregaClima();
56 }
57
58 carregaClima() async {
59 setState(() {
60 isLoading = true;
61 });
62
63 const String _appid = ""; //SUA chave da API
64 const String _lang = "pt_br";
65 const String _units = "metric";
66 const String _apiURL = "api.openweathermap.org";
67 const String _path = "/data/2.5/weather";
68
69 final _parametros = {
70 "q": _cidadeSelecionada,
71 "appid": _appid,
72 "lang": _lang,
73 "units": _units
74 };
75
76 final climaResponse =
77 await http.get(Uri.https(_apiURL, _path, _parametros));
78
79 //Apenas para verificar se a URL foi montada adequadamente:
80 //print('Url montada: ' + climaResponse.request.url.toString());
81
82 if (climaResponse.statusCode == 200) {
83 setState(() {
84 climaModel = ClimaModel.fromJson(jsonDecode(climaResponse.body));
85 isLoading = false;
86 });
87 }
88 }
89
90 @override
91 Widget build(BuildContext context) {
92 return Scaffold(
93 appBar: AppBar(
94 title: Text(_cidadeSelecionada),
95 centerTitle: true,
96 ),
97 body: Center(
98 child: Column(
99 children: [
100 _buildList(_cidades),
101 Expanded(
102 child: Column(
103 mainAxisAlignment: MainAxisAlignment.center,
104 children: [
105 Padding(
106 padding: EdgeInsets.all(6),
107 child: isLoading
108 ? const CircularProgressIndicator(
109 strokeWidth: 3,
110 valueColor: AlwaysStoppedAnimation(Colors.blue),
111 )
112 : climaModel != null
113 ? ClimaWidget(climaModel: climaModel)
114 : Container(
115 child: Text(
116 "Sem dados para exibir",
117 style: Theme.of(context).textTheme.headline3,
118 ),
119 )),
120 Padding(
121 padding: EdgeInsets.all(8),
122 child: isLoading
123 ? Container(
124 child: Text(
125 "Carregando...",
126 style: Theme.of(context).textTheme.headline5,
127 ),
128 )
129 : IconButton(
130 onPressed: carregaClima,
131 icon: const Icon(Icons.refresh),
132 color: Colors.blue,
133 iconSize: 50,
134 tooltip: "Recarrega o clima",
135 ))
136 ],
137 ))
138 ],
139 ),
140 ),
141 );
142 }
143
144 Widget _buildList(List<String> listData) {
145 return DropdownSearch<String>(
146 mode: Mode.MENU,
147 showSelectedItems: true,
148 maxHeight: MediaQuery.of(context).size.height - 100,
149 items: listData,
150 selectedItem: _cidadeSelecionada,
151 showSearchBox: true,
152 onChanged: (value) {
153 setState(() {
154 if (value == null || value == "") {
155 _cidadeSelecionada = "Selecione uma cidade";
156 } else {
157 _cidadeSelecionada = value;
158 carregaClima();
159 }
160 });
161 },
162 validator: (value) =>
163 value == null || value.isEmpty ? "Selecione uma cidade" : null,
164 autoValidateMode: AutovalidateMode.onUserInteraction,
165 showClearButton: false,
166 clearButton: const Icon(Icons.close),
167 );
168 }
169}