Wetter-App: Jetzt
Teil des Abschnitts Daten und Netzwerk der Flutter-Journey von Coddy. Lektion 23 von 27.
Jetzt ist es an der Zeit, in diesem Abschnitt eine ganze App zu erstellen: eine Wetter-App. In den nächsten fünf Lektionen zeigt sie das aktuelle Wetter für eine Stadt, das Wetter der nächsten drei Tage, ein Symbol für jeden Tag, einen Fehlerbildschirm mit „Erneut versuchen“ und eine Stadtauswahl.
Die Übungs-API kennt drei Städte. /weather/lisbon liefert:
{
"city": "Lisbon",
"temperature": 21,
"condition": "Sunny",
"forecast": [ ... ]
}Beginne oben auf dem Bildschirm und mit den Schritten, die du bereits kennst: eine Klasse für die Daten, eine Funktion, die sie abruft und dekodiert, ein Future, das einmal in initState erstellt wird, und einen FutureBuilder mit seinen drei Zuständen. Die Klassen Weather und DayForecast am Ende der Datei sind bereits für dich geschrieben, einschließlich ihrer fromJson-Methode. In dieser Lektion wird das aktuelle Wetter angezeigt; die Vorhersage folgt in der nächsten.
Aufgabe
SchwerZeige das Wetter in Lissabon:
loadWeatherruft/weather/lisbonab und gibtWeather.fromJson(jsonDecode(body))zurück- erstelle das Future einmal in
initState - ein
FutureBuilder<Weather>zeigt während des Ladens einen Spinner an; bei einem Fehler zeigt erCould not load:und den Fehler an - mit den Daten: eine
Columnmit der Stadt (Größe 32), der Temperatur mit Gradzeichen,21°(Größe 72, fett) und dem Wetterzustand (Größe 24)
Probier es selbst
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,
);
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Daten und Netzwerk
2Ladebildschirme
Ein Spinner während des LadensFutureBuilder kennenlernenEinmalig in initState ladenDaten per Button neu ladenZum Aktualisieren nach unten ziehen5Datumsangaben und Preise
Datumsangaben mit DateFormatUhrzeiten mit DateFormatPreise mit NumberFormat3Wenn Aufrufe fehlschlagen
Fehler mit try abfangenEinen Fehler auslösenAufräumen mit finallyDer Fehlerzustand von FutureBuilderEine Erneut-versuchen-Schaltfläche6Projekt: Wetter-App
Wetter-App: JetztWetter-App: Die nächsten drei TageÜbe selbstständig: Online-Flutter-Compiler