· 3 years ago · Oct 29, 2021, 11:40 PM
1import 'package:flutter/material.dart';
2import 'package:dropdown_search/dropdown_search.dart';
3import 'package:http/http.dart' as http;
4import 'dart:convert';
5import 'package:uni_clima/model/clima_model.dart';
6
7class Home extends StatefulWidget {
8 const Home({Key? key}) : super(key: key);
9
10 @override
11 _HomeState createState() => _HomeState();
12}
13
14class _HomeState extends State<Home> {
15
16 late ClimaModel climaModel;
17
18 final List<String> _cidades = [
19 "Aracaju",
20 "Belém",
21 "Belo Horizonte",
22 "Boa Vista",
23 "Brasilia",
24 "Campo Grande",
25 "Cuiaba",
26 "Curitiba",
27 "Florianópolis",
28 "Fortaleza",
29 "Goiânia",
30 "João Pessoa",
31 "Macapá",
32 "Maceió",
33 "Manaus",
34 "Natal",
35 "Palmas",
36 "Porto Alegre",
37 "Porto Velho",
38 "Recife",
39 "Rio Branco",
40 "Rio de Janeiro",
41 "Salvador",
42 "São Luis",
43 "São Paulo",
44 "Teresina",
45 "Vitória"
46 ];
47
48 String _cidadeSelecionada = "São Paulo";
49
50 carregaClima() async {
51 const String _apiURL = "api.openweathermap.org"; //link da API do OpenWeatherMap
52 const String _path = "/data/2.5/weather"; //a pasta da API
53 const String _appid = ""; //SUA chave de API
54 const String _units = "metric";
55 const String _lang = "pt_br";
56
57 final _parametros = {
58 "q": _cidadeSelecionada,
59 "appid": _appid,
60 "units": _units,
61 "lang": _lang
62 };
63
64 final tempoResponse = await http.get(Uri.https(_apiURL, _path, _parametros));
65
66 //apenas para fins de depuração:
67 //print("URL Montada:" + tempoResponse.request!.url.toString());
68
69 if(tempoResponse.statusCode == 200) {
70 climaModel = ClimaModel.fromJson(jsonDecode(tempoResponse.body));
71 }
72 }
73
74 @override
75 Widget build(BuildContext context) {
76 double height = MediaQuery.of(context).size.height;
77 var padding = MediaQuery.of(context).padding;
78
79 return Scaffold(
80 appBar: AppBar(
81 title: Text(_cidadeSelecionada),
82 centerTitle: true,
83 ),
84 body: Center(
85 child: Column(
86 children: [
87 DropdownSearch<String>(
88 mode: Mode.MENU,
89 showSelectedItems: true,
90 items: _cidades,
91 showSearchBox: true,
92 maxHeight: height - padding.top - padding.bottom - 25,
93 onChanged: (value) {
94 setState(() {
95 _cidadeSelecionada = value!;
96 carregaClima();
97 });
98 },
99 ),
100 ],
101 ),
102 ),
103 );
104 }
105}
106