show daily weather at different times, use weather icons, get prevalent weather icon for the day

This commit is contained in:
Konstantin Kollar
2022-09-02 14:32:36 +02:00
parent 4fac2ecf0a
commit 20d197c505
3 changed files with 104 additions and 23 deletions
+47 -23
View File
@@ -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<CompactWeatherData> {
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")
],
);
}
}
+24
View File
@@ -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<String> icons = hourlyForecasts.map((e) => e.icon!).toList();
Map<String, int> usedIconCount = {};
for (String i in icons) {
if (!usedIconCount.containsKey(i)) {
usedIconCount[i] = 1;
} else {
usedIconCount[i] = (usedIconCount[i]! + 1);
}
}
Map<String, int> sortedValuesDesc = SplayTreeMap<String, int>.from(
usedIconCount,
(keys1, keys2) =>
usedIconCount[keys2]!.compareTo(usedIconCount[keys1]!));
return sortedValuesDesc.keys.first;
}
}
+33
View File
@@ -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;
}
}