App meteo: adesso
Fa parte della sezione Dati e rete del percorso Flutter di Coddy. Lezione 23 di 27.
È il momento di creare un’intera app a partire da questa sezione: un’app meteo. Nelle prossime cinque lezioni mostrerà il meteo attuale di una città, quello dei tre giorni successivi, un’icona per ciascun giorno, una schermata di errore con il pulsante Riprova e un selettore di città.
L’API di esercitazione conosce tre città. /weather/lisbon risponde:
{
"city": "Lisbon",
"temperature": 21,
"condition": "Sunny",
"forecast": [ ... ]
}Inizia dalla parte superiore dello schermo e dai passaggi che conosci: una classe per i dati, una funzione che li recupera e decodifica, un future creato una sola volta in initState e un FutureBuilder con i suoi tre stati. Le classi Weather e DayForecast in fondo al file sono già state scritte per te, insieme al loro fromJson. In questa lezione vedrai il meteo attuale; le previsioni arriveranno nella prossima.
Sfida
DifficileMostra il meteo di Lisbona:
loadWeatherrecupera/weather/lisbone restituisceWeather.fromJson(jsonDecode(body))- crea il future una volta in
initState - un
FutureBuilder<Weather>mostra un indicatore di caricamento mentre carica,Could not load:e l'errore se non riesce - con i dati, una
Columncon la città (dimensione 32), la temperatura con il simbolo dei gradi,21°(dimensione 72, grassetto) e la condizione (dimensione 24)
Provalo tu
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,
);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Dati e rete
3Quando le chiamate falliscono
Gestire gli errori con tryLanciare un errorePulire con finallyLo stato di errore di FutureBuilderUn pulsante per riprovare6Progetto: App meteo
App meteo: adessoApp meteo: i prossimi tre giorniEsercitati da solo: Compilatore Flutter online