Aplikacja pogodowa: teraz
Część sekcji Dane i sieć ścieżki Flutter w Coddy. Lekcja 23 z 27.
Czas zbudować całą aplikację w tej sekcji: aplikację pogodową. W ciągu następnych pięciu lekcji pokaże ona pogodę w mieście teraz i przez kolejne trzy dni, ikonę dla każdego dnia, ekran błędu z przyciskiem „Spróbuj ponownie” oraz selektor miasta.
Testowe API zna trzy miasta. Odpowiedź z /weather/lisbon wygląda tak:
{
"city": "Lisbon",
"temperature": 21,
"condition": "Sunny",
"forecast": [ ... ]
}Zacznij od góry ekranu i znanych Ci kroków: klasy przechowującej dane, funkcji, która je pobiera i dekoduje, obiektu Future utworzonego raz w initState oraz FutureBuilder z trzema stanami. Klasy Weather i DayForecast na dole pliku zostały napisane za Ciebie, podobnie jak ich metoda fromJson. Ta lekcja pokazuje aktualną pogodę; prognoza pojawi się w następnej lekcji.
Wyzwanie
TrudnyPokaż pogodę w Lizbonie:
loadWeatherpobiera/weather/lisboni zwracaWeather.fromJson(jsonDecode(body))- utwórz obiekt przyszłości raz w
initState FutureBuilder<Weather>wyświetla wskaźnik ładowania, gdy dane są pobierane, a w razie niepowodzeniaCould not load:oraz błąd- gdy dane są dostępne, wyświetl
Columnz nazwą miasta (rozmiar 32), temperaturą ze znakiem stopnia,21°(rozmiar 72, pogrubiona) i warunkami pogodowymi (rozmiar 24)
Spróbuj swoich sił
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,
);
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Dane i sieć
3Gdy wywołania kończą się niepowodzeniem
Przechwytywanie błędów za pomocą tryZgłaszanie błęduSprzątanie za pomocą finallyStan błędu w FutureBuilderPrzycisk „Spróbuj ponownie”6Projekt: Aplikacja pogodowa
Aplikacja pogodowa: terazAplikacja pogodowa: najbliższe trzy dniPoćwicz samodzielnie: Kompilator Flutter online