From 20d197c505a915feedb38738400173502249b785 Mon Sep 17 00:00:00 2001 From: Konstantin Kollar Date: Fri, 2 Sep 2022 14:32:36 +0200 Subject: [PATCH] show daily weather at different times, use weather icons, get prevalent weather icon for the day --- lib/components/compact_weather_data.dart | 70 ++++++++++++++++-------- lib/models/daily_weather_model.dart | 24 ++++++++ lib/services/utils.dart | 33 +++++++++++ 3 files changed, 104 insertions(+), 23 deletions(-) create mode 100644 lib/services/utils.dart diff --git a/lib/components/compact_weather_data.dart b/lib/components/compact_weather_data.dart index 24b813a..42e6571 100644 --- a/lib/components/compact_weather_data.dart +++ b/lib/components/compact_weather_data.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:weather_icons/weather_icons.dart'; import 'package:wetter/models/daily_weather_model.dart'; +import 'package:wetter/models/hourly_weather_model.dart'; +import 'package:wetter/services/utils.dart'; class CompactWeatherData extends StatefulWidget { final DailyWeatherModel dwm; @@ -18,29 +20,51 @@ class _CompactWeatherDataState extends State { return Card( child: Padding( padding: const EdgeInsets.all(20), - child: Column( - children: [ + child: Column(children: [ + Text( + "${DateFormat('EEEE').format(widget.dwm.dateOfDay())}, ${widget.dwm.dateOfDay().day}.${widget.dwm.dateOfDay().month}.", + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox(height: 20), + Icon(weatherIcon(widget.dwm.prevalentWeatherIcon())), + Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + const Icon(WeatherIcons.thermometer), Text( - "${DateFormat('EEEE').format(widget.dwm.dateOfDay())}, ${widget.dwm.dateOfDay().day}.${widget.dwm.dateOfDay().month}.", - style: Theme.of(context).textTheme.headline4, - ), - const SizedBox(height: 20), - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(WeatherIcons.thermometer), - Text( - "${widget.dwm.dailyMaxTemp()} °C", - style: Theme.of(context).textTheme.bodyLarge, - ) - ]), - const SizedBox(height: 20), - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(WeatherIcons.thermometer_exterior), - Text( - "${widget.dwm.dailyMinTemp()} °C", - style: Theme.of(context).textTheme.bodyLarge, - ) - ]), - ], - ))); + "${widget.dwm.dailyMaxTemp()} °C", + style: Theme.of(context).textTheme.bodyLarge, + ) + ]), + const SizedBox(height: 20), + Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + const Icon(WeatherIcons.thermometer_exterior), + Text( + "${widget.dwm.dailyMinTemp()} °C", + style: Theme.of(context).textTheme.bodyLarge, + ) + ]), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _hourlyInfo(widget.dwm.hourlyWeatherModelAtTimeOfDay(4)), + _hourlyInfo(widget.dwm.hourlyWeatherModelAtTimeOfDay(8)), + _hourlyInfo(widget.dwm.hourlyWeatherModelAtTimeOfDay(12)), + _hourlyInfo(widget.dwm.hourlyWeatherModelAtTimeOfDay(16)), + _hourlyInfo(widget.dwm.hourlyWeatherModelAtTimeOfDay(20)) + ], + ), + ]))); + } + + Widget _hourlyInfo(HourlyWeatherModel hwm) { + return Column( + children: [ + Text(DateFormat.Hm().format(hwm.timestamp)), + const SizedBox(height: 8), + Icon(weatherIcon(hwm.icon ?? "not defined")), + const SizedBox(height: 14), + Text("${hwm.temperature.round()} °C") + ], + ); } } diff --git a/lib/models/daily_weather_model.dart b/lib/models/daily_weather_model.dart index 749def7..a78e940 100644 --- a/lib/models/daily_weather_model.dart +++ b/lib/models/daily_weather_model.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:wetter/models/hourly_weather_model.dart'; import 'dart:math'; @@ -54,4 +56,26 @@ class DailyWeatherModel { return csm.toString(); } } + + HourlyWeatherModel hourlyWeatherModelAtTimeOfDay(int tod) { + return hourlyForecasts + .firstWhere((element) => element.timestamp.hour == tod); + } + + String prevalentWeatherIcon() { + List icons = hourlyForecasts.map((e) => e.icon!).toList(); + Map usedIconCount = {}; + for (String i in icons) { + if (!usedIconCount.containsKey(i)) { + usedIconCount[i] = 1; + } else { + usedIconCount[i] = (usedIconCount[i]! + 1); + } + } + Map sortedValuesDesc = SplayTreeMap.from( + usedIconCount, + (keys1, keys2) => + usedIconCount[keys2]!.compareTo(usedIconCount[keys1]!)); + return sortedValuesDesc.keys.first; + } } diff --git a/lib/services/utils.dart b/lib/services/utils.dart new file mode 100644 index 0000000..333fb9d --- /dev/null +++ b/lib/services/utils.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:weather_icons/weather_icons.dart'; + +IconData weatherIcon(String icon) { + switch (icon) { + case "clear-day": + return WeatherIcons.day_sunny; + case "clear-night": + return WeatherIcons.night_clear; + case "partly-cloudy-day": + return WeatherIcons.day_sunny_overcast; + case "partly-cloudy-night": + return WeatherIcons.night_partly_cloudy; + case "cloudy": + return WeatherIcons.cloudy; + case "fog": + return WeatherIcons.fog; + case "wind": + return WeatherIcons.day_windy; + case "rain": + return WeatherIcons.day_rain; + case "sleet": + return WeatherIcons.day_sleet; + case "snow": + return WeatherIcons.day_snow; + case "hail": + return WeatherIcons.day_hail; + case "thunderstorm": + return WeatherIcons.day_thunderstorm; + default: + return WeatherIcons.alien; + } +}