Aplicativo de Previsão do Tempo: Agora
Parte da seção Dados e rede do Journey de Flutter da Coddy. Lição 23 de 27.
Hora de criar um aplicativo completo a partir desta seção: um aplicativo de previsão do tempo. Nas próximas cinco aulas, ele mostra o clima de uma cidade neste momento, dos próximos três dias, um ícone para cada dia, uma tela de erro com a opção Tentar novamente e um seletor de cidades.
A API de prática conhece três cidades. /weather/lisbon responde:
{
"city": "Lisbon",
"temperature": 21,
"condition": "Sunny",
"forecast": [ ... ]
}Comece pelo topo da tela e pelas etapas que você já conhece: uma classe para os dados, uma função que os busca e decodifica, um futuro criado uma única vez em initState e um FutureBuilder com seus três estados. As classes Weather e DayForecast na parte inferior do arquivo já estão escritas para você, assim como o método fromJson delas. Esta aula mostra o clima atual; a previsão vem na próxima.
Desafio
DifícilMostre o clima de Lisboa:
loadWeatherbusca/weather/lisbone retornaWeather.fromJson(jsonDecode(body))- crie o future uma única vez em
initState - um
FutureBuilder<Weather>mostra um indicador de carregamento enquanto carrega,Could not load:e o erro se falhar - com os dados, uma
Columncom a cidade (tamanho 32), a temperatura com o símbolo de grau,21°(tamanho 72, em negrito) e a condição (tamanho 24)
Experimente você mesmo
import 'dart:convert';
import 'package:flutter/material.dart';
import 'api.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: WeatherScreen(),
);
}
}
class WeatherScreen extends StatefulWidget {
const WeatherScreen({super.key});
@override
State<WeatherScreen> createState() => _WeatherScreenState();
}
class _WeatherScreenState extends State<WeatherScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Weather')),
body: const Center(
child: Text('The weather goes here'),
),
);
}
}
class Weather {
Weather({
required this.city,
required this.temperature,
required this.condition,
required this.forecast,
});
final String city;
final int temperature;
final String condition;
final List<DayForecast> forecast;
factory Weather.fromJson(Map<String, dynamic> json) {
final days = json['forecast'] as List<dynamic>;
return Weather(
city: json['city'] as String,
temperature: json['temperature'] as int,
condition: json['condition'] as String,
forecast: days
.map((day) => DayForecast.fromJson(day as Map<String, dynamic>))
.toList(),
);
}
}
class DayForecast {
DayForecast({
required this.date,
required this.condition,
required this.high,
required this.low,
});
final DateTime date;
final String condition;
final int high;
final int low;
factory DayForecast.fromJson(Map<String, dynamic> json) {
return DayForecast(
date: DateTime.parse(json['date'] as String),
condition: json['condition'] as String,
high: json['high'] as int,
low: json['low'] as int,
);
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Dados e rede
3Quando as chamadas falham
Capturando erros com tryLançando um erroFazendo a limpeza com finallyO estado de erro do FutureBuilderUm botão para tentar novamente6Projeto: Aplicativo de Previsão do Tempo
Aplicativo de Previsão do Tempo: AgoraAplicativo de Previsão do Tempo: Próximos Três DiasPratique por conta própria: Compilador de Flutter online