Приложение «Погода»: сейчас
Часть раздела Данные и сеть путешествия по Flutter на Coddy. Урок 23 из 27.
Пора создать целое приложение на основе этого раздела: приложение о погоде. В следующих пяти уроках оно покажет погоду в городе прямо сейчас и на ближайшие три дня, значок для каждого дня, экран ошибки с кнопкой «Попробовать снова» и выбор города.
Тестовый API знает три города. На запрос /weather/lisbon приходит ответ:
{
"city": "Lisbon",
"temperature": 21,
"condition": "Sunny",
"forecast": [ ... ]
}Начни с верхней части экрана и используй уже знакомые шаги: класс для данных, функцию для их получения и декодирования, future, создаваемый один раз в initState, и FutureBuilder с его тремя состояниями. Классы Weather и DayForecast внизу файла уже написаны, как и их fromJson. В этом уроке отображается текущая погода; прогноз будет в следующем.
Задание
СложноПокажи погоду в Лиссабоне:
loadWeatherполучает данные из/weather/lisbonи возвращаетWeather.fromJson(jsonDecode(body))- создай future один раз в
initState FutureBuilder<Weather>показывает индикатор загрузки, пока загружаются данные, а в случае ошибки —Could not load:и текст ошибки- при наличии данных —
Columnс названием города (размер 32), температурой со знаком градуса,21°(размер 72, полужирный шрифт) и состоянием погоды (размер 24)
Попробуйте сами
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,
);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Данные и сеть
1Future (асинхронные результаты)
Значение, которое появится позжеОжидание с async и awaitФункции, возвращающие FutureПрактический API Coddy3Когда вызовы завершаются ошибкой
Перехват ошибок с помощью tryВыбрасывание ошибкиОчистка с помощью finallyСостояние ошибки в FutureBuilderКнопка «Попробовать снова»6Проект: приложение «Погода»
Приложение «Погода»: сейчасПриложение «Погода»: ближайшие три дняПотренируйтесь самостоятельно: Онлайн-компилятор Flutter