Menu
CoddyTech

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.

challenge icon

Sfida

Difficile

Mostra il meteo di Lisbona:

  • loadWeather recupera /weather/lisbon e restituisce Weather.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 Column con 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,
    );
  }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Dati e rete

Esercitati da solo: Compilatore Flutter online