mirror of
https://github.com/darkmoonight/Rain.git
synced 2025-06-28 20:19:58 +00:00
added dewpoint_2m,precipitation_probability,shortwave_radiation
This commit is contained in:
parent
0306dbbc6c
commit
53a47b3f90
15 changed files with 1691 additions and 275 deletions
BIN
assets/images/dew.png
Normal file
BIN
assets/images/dew.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
assets/images/precipitation_probability.png
Normal file
BIN
assets/images/precipitation_probability.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
BIN
assets/images/shortwave_radiation.png
Normal file
BIN
assets/images/shortwave_radiation.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
|
@ -13,7 +13,7 @@ class WeatherAPI {
|
||||||
|
|
||||||
Future<MainWeatherCache> getWeatherData(double? lat, double? lon) async {
|
Future<MainWeatherCache> getWeatherData(double? lat, double? lon) async {
|
||||||
String url =
|
String url =
|
||||||
'latitude=$lat&longitude=$lon&hourly=temperature_2m,relativehumidity_2m,apparent_temperature,precipitation,rain,weathercode,surface_pressure,visibility,evapotranspiration,windspeed_10m,winddirection_10m,windgusts_10m,cloudcover,uv_index&daily=weathercode,temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,sunrise,sunset,precipitation_sum,precipitation_probability_max,windspeed_10m_max,windgusts_10m_max,uv_index_max,rain_sum,winddirection_10m_dominant&forecast_days=12&timezone=auto';
|
'latitude=$lat&longitude=$lon&hourly=temperature_2m,relativehumidity_2m,apparent_temperature,precipitation,rain,weathercode,surface_pressure,visibility,evapotranspiration,windspeed_10m,winddirection_10m,windgusts_10m,cloudcover,uv_index,dewpoint_2m,precipitation_probability,shortwave_radiation&daily=weathercode,temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,sunrise,sunset,precipitation_sum,precipitation_probability_max,windspeed_10m_max,windgusts_10m_max,uv_index_max,rain_sum,winddirection_10m_dominant&forecast_days=12&timezone=auto';
|
||||||
String urlWeather;
|
String urlWeather;
|
||||||
settings.measurements == 'imperial' && settings.degrees == 'fahrenheit'
|
settings.measurements == 'imperial' && settings.degrees == 'fahrenheit'
|
||||||
? urlWeather =
|
? urlWeather =
|
||||||
|
@ -42,6 +42,9 @@ class WeatherAPI {
|
||||||
windgusts10M: weatherData.hourly.windgusts10M,
|
windgusts10M: weatherData.hourly.windgusts10M,
|
||||||
cloudcover: weatherData.hourly.cloudcover,
|
cloudcover: weatherData.hourly.cloudcover,
|
||||||
uvIndex: weatherData.hourly.uvIndex,
|
uvIndex: weatherData.hourly.uvIndex,
|
||||||
|
dewpoint2M: weatherData.hourly.dewpoint2M,
|
||||||
|
precipitationProbability: weatherData.hourly.precipitationProbability,
|
||||||
|
shortwaveRadiation: weatherData.hourly.shortwaveRadiation,
|
||||||
timeDaily: weatherData.daily.time,
|
timeDaily: weatherData.daily.time,
|
||||||
weathercodeDaily: weatherData.daily.weathercode,
|
weathercodeDaily: weatherData.daily.weathercode,
|
||||||
temperature2MMax: weatherData.daily.temperature2MMax,
|
temperature2MMax: weatherData.daily.temperature2MMax,
|
||||||
|
@ -72,7 +75,7 @@ class WeatherAPI {
|
||||||
Future<WeatherCard> getWeatherCard(double? lat, double? lon, String city,
|
Future<WeatherCard> getWeatherCard(double? lat, double? lon, String city,
|
||||||
String district, String timezone) async {
|
String district, String timezone) async {
|
||||||
String url =
|
String url =
|
||||||
'latitude=$lat&longitude=$lon&hourly=temperature_2m,relativehumidity_2m,apparent_temperature,precipitation,rain,weathercode,surface_pressure,visibility,evapotranspiration,windspeed_10m,winddirection_10m,windgusts_10m,cloudcover,uv_index&daily=weathercode,temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,sunrise,sunset,precipitation_sum,precipitation_probability_max,windspeed_10m_max,windgusts_10m_max,uv_index_max,rain_sum,winddirection_10m_dominant&forecast_days=12&timezone=auto';
|
'latitude=$lat&longitude=$lon&hourly=temperature_2m,relativehumidity_2m,apparent_temperature,precipitation,rain,weathercode,surface_pressure,visibility,evapotranspiration,windspeed_10m,winddirection_10m,windgusts_10m,cloudcover,uv_index,dewpoint_2m,precipitation_probability,shortwave_radiation&daily=weathercode,temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,sunrise,sunset,precipitation_sum,precipitation_probability_max,windspeed_10m_max,windgusts_10m_max,uv_index_max,rain_sum,winddirection_10m_dominant&forecast_days=12&timezone=auto';
|
||||||
String urlWeather;
|
String urlWeather;
|
||||||
settings.measurements == 'imperial' && settings.degrees == 'fahrenheit'
|
settings.measurements == 'imperial' && settings.degrees == 'fahrenheit'
|
||||||
? urlWeather =
|
? urlWeather =
|
||||||
|
@ -101,6 +104,9 @@ class WeatherAPI {
|
||||||
windgusts10M: weatherData.hourly.windgusts10M,
|
windgusts10M: weatherData.hourly.windgusts10M,
|
||||||
cloudcover: weatherData.hourly.cloudcover,
|
cloudcover: weatherData.hourly.cloudcover,
|
||||||
uvIndex: weatherData.hourly.uvIndex,
|
uvIndex: weatherData.hourly.uvIndex,
|
||||||
|
dewpoint2M: weatherData.hourly.dewpoint2M,
|
||||||
|
precipitationProbability: weatherData.hourly.precipitationProbability,
|
||||||
|
shortwaveRadiation: weatherData.hourly.shortwaveRadiation,
|
||||||
timeDaily: weatherData.daily.time,
|
timeDaily: weatherData.daily.time,
|
||||||
weathercodeDaily: weatherData.daily.weathercode,
|
weathercodeDaily: weatherData.daily.weathercode,
|
||||||
temperature2MMax: weatherData.daily.temperature2MMax,
|
temperature2MMax: weatherData.daily.temperature2MMax,
|
||||||
|
|
|
@ -32,6 +32,9 @@ class Hourly {
|
||||||
List<double?>? windgusts10M;
|
List<double?>? windgusts10M;
|
||||||
List<int?>? cloudcover;
|
List<int?>? cloudcover;
|
||||||
List<double?>? uvIndex;
|
List<double?>? uvIndex;
|
||||||
|
List<double?>? dewpoint2M;
|
||||||
|
List<int?>? precipitationProbability;
|
||||||
|
List<double?>? shortwaveRadiation;
|
||||||
|
|
||||||
Hourly({
|
Hourly({
|
||||||
this.time,
|
this.time,
|
||||||
|
@ -49,6 +52,9 @@ class Hourly {
|
||||||
this.windgusts10M,
|
this.windgusts10M,
|
||||||
this.cloudcover,
|
this.cloudcover,
|
||||||
this.uvIndex,
|
this.uvIndex,
|
||||||
|
this.dewpoint2M,
|
||||||
|
this.precipitationProbability,
|
||||||
|
this.shortwaveRadiation,
|
||||||
});
|
});
|
||||||
|
|
||||||
factory Hourly.fromJson(Map<String, dynamic> json) => Hourly(
|
factory Hourly.fromJson(Map<String, dynamic> json) => Hourly(
|
||||||
|
@ -72,6 +78,11 @@ class Hourly {
|
||||||
windgusts10M: List<double?>.from(json['windgusts_10m'].map((x) => x)),
|
windgusts10M: List<double?>.from(json['windgusts_10m'].map((x) => x)),
|
||||||
cloudcover: List<int?>.from(json['cloudcover'].map((x) => x)),
|
cloudcover: List<int?>.from(json['cloudcover'].map((x) => x)),
|
||||||
uvIndex: List<double?>.from(json['uv_index'].map((x) => x)),
|
uvIndex: List<double?>.from(json['uv_index'].map((x) => x)),
|
||||||
|
dewpoint2M: List<double?>.from(json['dewpoint_2m'].map((x) => x)),
|
||||||
|
precipitationProbability:
|
||||||
|
List<int?>.from(json['precipitation_probability'].map((x) => x)),
|
||||||
|
shortwaveRadiation:
|
||||||
|
List<double?>.from(json['shortwave_radiation'].map((x) => x)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,9 @@ class MainWeatherCache {
|
||||||
List<double?>? windgusts10M;
|
List<double?>? windgusts10M;
|
||||||
List<int?>? cloudcover;
|
List<int?>? cloudcover;
|
||||||
List<double?>? uvIndex;
|
List<double?>? uvIndex;
|
||||||
|
List<double?>? dewpoint2M;
|
||||||
|
List<int?>? precipitationProbability;
|
||||||
|
List<double?>? shortwaveRadiation;
|
||||||
List<DateTime>? timeDaily;
|
List<DateTime>? timeDaily;
|
||||||
List<int?>? weathercodeDaily;
|
List<int?>? weathercodeDaily;
|
||||||
List<double?>? temperature2MMax;
|
List<double?>? temperature2MMax;
|
||||||
|
@ -73,6 +76,9 @@ class MainWeatherCache {
|
||||||
this.windgusts10M,
|
this.windgusts10M,
|
||||||
this.cloudcover,
|
this.cloudcover,
|
||||||
this.uvIndex,
|
this.uvIndex,
|
||||||
|
this.dewpoint2M,
|
||||||
|
this.precipitationProbability,
|
||||||
|
this.shortwaveRadiation,
|
||||||
this.timeDaily,
|
this.timeDaily,
|
||||||
this.weathercodeDaily,
|
this.weathercodeDaily,
|
||||||
this.temperature2MMax,
|
this.temperature2MMax,
|
||||||
|
@ -109,6 +115,9 @@ class MainWeatherCache {
|
||||||
'windgusts10M': windgusts10M,
|
'windgusts10M': windgusts10M,
|
||||||
'cloudcover': cloudcover,
|
'cloudcover': cloudcover,
|
||||||
'uvIndex': uvIndex,
|
'uvIndex': uvIndex,
|
||||||
|
'dewpoint2M': dewpoint2M,
|
||||||
|
'precipitationProbability': precipitationProbability,
|
||||||
|
'shortwaveRadiation': shortwaveRadiation,
|
||||||
'timeDaily': timeDaily,
|
'timeDaily': timeDaily,
|
||||||
'weathercodeDaily': weathercodeDaily,
|
'weathercodeDaily': weathercodeDaily,
|
||||||
'temperature2MMax': temperature2MMax,
|
'temperature2MMax': temperature2MMax,
|
||||||
|
@ -163,6 +172,9 @@ class WeatherCard {
|
||||||
List<double?>? windgusts10M;
|
List<double?>? windgusts10M;
|
||||||
List<int?>? cloudcover;
|
List<int?>? cloudcover;
|
||||||
List<double?>? uvIndex;
|
List<double?>? uvIndex;
|
||||||
|
List<double?>? dewpoint2M;
|
||||||
|
List<int?>? precipitationProbability;
|
||||||
|
List<double?>? shortwaveRadiation;
|
||||||
List<DateTime>? timeDaily;
|
List<DateTime>? timeDaily;
|
||||||
List<int?>? weathercodeDaily;
|
List<int?>? weathercodeDaily;
|
||||||
List<double?>? temperature2MMax;
|
List<double?>? temperature2MMax;
|
||||||
|
@ -202,6 +214,9 @@ class WeatherCard {
|
||||||
this.windgusts10M,
|
this.windgusts10M,
|
||||||
this.cloudcover,
|
this.cloudcover,
|
||||||
this.uvIndex,
|
this.uvIndex,
|
||||||
|
this.dewpoint2M,
|
||||||
|
this.precipitationProbability,
|
||||||
|
this.shortwaveRadiation,
|
||||||
this.timeDaily,
|
this.timeDaily,
|
||||||
this.weathercodeDaily,
|
this.weathercodeDaily,
|
||||||
this.temperature2MMax,
|
this.temperature2MMax,
|
||||||
|
@ -243,6 +258,9 @@ class WeatherCard {
|
||||||
'windgusts10M': windgusts10M,
|
'windgusts10M': windgusts10M,
|
||||||
'cloudcover': cloudcover,
|
'cloudcover': cloudcover,
|
||||||
'uvIndex': uvIndex,
|
'uvIndex': uvIndex,
|
||||||
|
'dewpoint2M': dewpoint2M,
|
||||||
|
'precipitationProbability': precipitationProbability,
|
||||||
|
'shortwaveRadiation': shortwaveRadiation,
|
||||||
'timeDaily': timeDaily,
|
'timeDaily': timeDaily,
|
||||||
'weathercodeDaily': weathercodeDaily,
|
'weathercodeDaily': weathercodeDaily,
|
||||||
'temperature2MMax': temperature2MMax,
|
'temperature2MMax': temperature2MMax,
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -164,6 +164,10 @@ class _InfoWeatherCardState extends State<InfoWeatherCard> {
|
||||||
cloudcover: weatherCard.cloudcover?[timeNow],
|
cloudcover: weatherCard.cloudcover?[timeNow],
|
||||||
windgusts: weatherCard.windgusts10M?[timeNow],
|
windgusts: weatherCard.windgusts10M?[timeNow],
|
||||||
uvIndex: weatherCard.uvIndex?[timeNow],
|
uvIndex: weatherCard.uvIndex?[timeNow],
|
||||||
|
dewpoint2M: weatherCard.dewpoint2M?[timeNow],
|
||||||
|
precipitationProbability:
|
||||||
|
weatherCard.precipitationProbability?[timeNow],
|
||||||
|
shortwaveRadiation: weatherCard.shortwaveRadiation?[timeNow],
|
||||||
),
|
),
|
||||||
WeatherDaily(
|
WeatherDaily(
|
||||||
weatherData: weatherCard.toJson(),
|
weatherData: weatherCard.toJson(),
|
||||||
|
|
|
@ -151,6 +151,11 @@ class _WeatherPageState extends State<WeatherPage> {
|
||||||
cloudcover: mainWeather.cloudcover![hourOfDay],
|
cloudcover: mainWeather.cloudcover![hourOfDay],
|
||||||
windgusts: mainWeather.windgusts10M![hourOfDay],
|
windgusts: mainWeather.windgusts10M![hourOfDay],
|
||||||
uvIndex: mainWeather.uvIndex![hourOfDay],
|
uvIndex: mainWeather.uvIndex![hourOfDay],
|
||||||
|
dewpoint2M: mainWeather.dewpoint2M![hourOfDay],
|
||||||
|
precipitationProbability:
|
||||||
|
mainWeather.precipitationProbability![hourOfDay],
|
||||||
|
shortwaveRadiation:
|
||||||
|
mainWeather.shortwaveRadiation![hourOfDay],
|
||||||
),
|
),
|
||||||
WeatherDaily(
|
WeatherDaily(
|
||||||
weatherData: mainWeather.toJson(),
|
weatherData: mainWeather.toJson(),
|
||||||
|
|
|
@ -67,7 +67,8 @@ class _InfoDailyCardState extends State<InfoDailyCard> {
|
||||||
highlightColor: Colors.transparent,
|
highlightColor: Colors.transparent,
|
||||||
),
|
),
|
||||||
title: Text(
|
title: Text(
|
||||||
DateFormat.MMMMEEEEd(locale.languageCode).format(timeDaily[pageIndex]),
|
DateFormat.MMMMEEEEd(locale.languageCode)
|
||||||
|
.format(timeDaily[pageIndex]),
|
||||||
style: textTheme.titleMedium?.copyWith(
|
style: textTheme.titleMedium?.copyWith(
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w600,
|
||||||
fontSize: 18,
|
fontSize: 18,
|
||||||
|
@ -85,13 +86,17 @@ class _InfoDailyCardState extends State<InfoDailyCard> {
|
||||||
itemCount: timeDaily.length,
|
itemCount: timeDaily.length,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final indexedWeatherCodeDaily = weatherCodeDaily[index];
|
final indexedWeatherCodeDaily = weatherCodeDaily[index];
|
||||||
final apparentTemperatureMin = weatherData['apparentTemperatureMin'][index];
|
final apparentTemperatureMin =
|
||||||
final apparentTemperatureMax = weatherData['apparentTemperatureMax'][index];
|
weatherData['apparentTemperatureMin'][index];
|
||||||
|
final apparentTemperatureMax =
|
||||||
|
weatherData['apparentTemperatureMax'][index];
|
||||||
final uvIndexMax = weatherData['uvIndexMax'][index];
|
final uvIndexMax = weatherData['uvIndexMax'][index];
|
||||||
final windDirection10MDominant = weatherData['winddirection10MDominant'][index];
|
final windDirection10MDominant =
|
||||||
|
weatherData['winddirection10MDominant'][index];
|
||||||
final windSpeed10MMax = weatherData['windspeed10MMax'][index];
|
final windSpeed10MMax = weatherData['windspeed10MMax'][index];
|
||||||
final windGusts10MMax = weatherData['windgusts10MMax'][index];
|
final windGusts10MMax = weatherData['windgusts10MMax'][index];
|
||||||
final precipitationProbabilityMax = weatherData['precipitationProbabilityMax'][index];
|
final precipitationProbabilityMax =
|
||||||
|
weatherData['precipitationProbabilityMax'][index];
|
||||||
final rainSum = weatherData['rainSum'][index];
|
final rainSum = weatherData['rainSum'][index];
|
||||||
final precipitationSum = weatherData['precipitationSum'][index];
|
final precipitationSum = weatherData['precipitationSum'][index];
|
||||||
|
|
||||||
|
@ -131,7 +136,8 @@ class _InfoDailyCardState extends State<InfoDailyCard> {
|
||||||
),
|
),
|
||||||
const SizedBox(height: 5),
|
const SizedBox(height: 5),
|
||||||
Text(
|
Text(
|
||||||
DateFormat.MMMMEEEEd(locale.languageCode).format(timeDaily[index]),
|
DateFormat.MMMMEEEEd(locale.languageCode)
|
||||||
|
.format(timeDaily[index]),
|
||||||
style: textTheme.labelLarge?.copyWith(
|
style: textTheme.labelLarge?.copyWith(
|
||||||
color: Colors.grey,
|
color: Colors.grey,
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
|
@ -158,14 +164,16 @@ class _InfoDailyCardState extends State<InfoDailyCard> {
|
||||||
? const Offstage()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/cold.png',
|
imageName: 'assets/images/cold.png',
|
||||||
value: statusData.getDegree(apparentTemperatureMin.round()),
|
value: statusData.getDegree(
|
||||||
|
apparentTemperatureMin.round()),
|
||||||
desc: 'apparentTemperatureMin'.tr,
|
desc: 'apparentTemperatureMin'.tr,
|
||||||
),
|
),
|
||||||
apparentTemperatureMax == null
|
apparentTemperatureMax == null
|
||||||
? const Offstage()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/hot.png',
|
imageName: 'assets/images/hot.png',
|
||||||
value: statusData.getDegree(apparentTemperatureMax.round()),
|
value: statusData.getDegree(
|
||||||
|
apparentTemperatureMax.round()),
|
||||||
desc: 'apparentTemperatureMax'.tr,
|
desc: 'apparentTemperatureMax'.tr,
|
||||||
),
|
),
|
||||||
uvIndexMax == null
|
uvIndexMax == null
|
||||||
|
@ -174,7 +182,8 @@ class _InfoDailyCardState extends State<InfoDailyCard> {
|
||||||
imageName: 'assets/images/uv.png',
|
imageName: 'assets/images/uv.png',
|
||||||
value: '${uvIndexMax.round()}',
|
value: '${uvIndexMax.round()}',
|
||||||
desc: 'uvIndex'.tr,
|
desc: 'uvIndex'.tr,
|
||||||
message: message.getUvIndex(uvIndexMax.round()),
|
message: message
|
||||||
|
.getUvIndex(uvIndexMax.round()),
|
||||||
),
|
),
|
||||||
windDirection10MDominant == null
|
windDirection10MDominant == null
|
||||||
? const Offstage()
|
? const Offstage()
|
||||||
|
@ -182,26 +191,31 @@ class _InfoDailyCardState extends State<InfoDailyCard> {
|
||||||
imageName: 'assets/images/windsock.png',
|
imageName: 'assets/images/windsock.png',
|
||||||
value: '$windDirection10MDominant°',
|
value: '$windDirection10MDominant°',
|
||||||
desc: 'direction'.tr,
|
desc: 'direction'.tr,
|
||||||
message: message.getDirection(windDirection10MDominant),
|
message: message.getDirection(
|
||||||
|
windDirection10MDominant),
|
||||||
),
|
),
|
||||||
windSpeed10MMax == null
|
windSpeed10MMax == null
|
||||||
? const Offstage()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/wind.png',
|
imageName: 'assets/images/wind.png',
|
||||||
value: statusData.getSpeed(windSpeed10MMax.round()),
|
value: statusData
|
||||||
|
.getSpeed(windSpeed10MMax.round()),
|
||||||
desc: 'wind'.tr,
|
desc: 'wind'.tr,
|
||||||
),
|
),
|
||||||
windGusts10MMax == null
|
windGusts10MMax == null
|
||||||
? const Offstage()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/windgusts.png',
|
imageName:
|
||||||
value: statusData.getSpeed(windGusts10MMax.round()),
|
'assets/images/windgusts.png',
|
||||||
|
value: statusData
|
||||||
|
.getSpeed(windGusts10MMax.round()),
|
||||||
desc: 'windgusts'.tr,
|
desc: 'windgusts'.tr,
|
||||||
),
|
),
|
||||||
precipitationProbabilityMax == null
|
precipitationProbabilityMax == null
|
||||||
? const Offstage()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/humidity.png',
|
imageName:
|
||||||
|
'assets/images/precipitation_probability.png',
|
||||||
value: '$precipitationProbabilityMax%',
|
value: '$precipitationProbabilityMax%',
|
||||||
desc: 'precipitationProbabilit'.tr,
|
desc: 'precipitationProbabilit'.tr,
|
||||||
),
|
),
|
||||||
|
@ -209,14 +223,16 @@ class _InfoDailyCardState extends State<InfoDailyCard> {
|
||||||
? const Offstage()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/water.png',
|
imageName: 'assets/images/water.png',
|
||||||
value: statusData.getPrecipitation(rainSum),
|
value: statusData
|
||||||
|
.getPrecipitation(rainSum),
|
||||||
desc: 'rain'.tr,
|
desc: 'rain'.tr,
|
||||||
),
|
),
|
||||||
precipitationSum == null
|
precipitationSum == null
|
||||||
? const Offstage()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/rainfall.png',
|
imageName: 'assets/images/rainfall.png',
|
||||||
value: statusData.getPrecipitation(precipitationSum),
|
value: statusData
|
||||||
|
.getPrecipitation(precipitationSum),
|
||||||
desc: 'precipitation'.tr,
|
desc: 'precipitation'.tr,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -19,6 +19,9 @@ class DescContainer extends StatefulWidget {
|
||||||
required this.cloudcover,
|
required this.cloudcover,
|
||||||
required this.windgusts,
|
required this.windgusts,
|
||||||
required this.uvIndex,
|
required this.uvIndex,
|
||||||
|
required this.dewpoint2M,
|
||||||
|
required this.precipitationProbability,
|
||||||
|
required this.shortwaveRadiation,
|
||||||
});
|
});
|
||||||
final int? humidity;
|
final int? humidity;
|
||||||
final double? wind;
|
final double? wind;
|
||||||
|
@ -32,6 +35,9 @@ class DescContainer extends StatefulWidget {
|
||||||
final int? cloudcover;
|
final int? cloudcover;
|
||||||
final double? windgusts;
|
final double? windgusts;
|
||||||
final double? uvIndex;
|
final double? uvIndex;
|
||||||
|
final double? dewpoint2M;
|
||||||
|
final int? precipitationProbability;
|
||||||
|
final double? shortwaveRadiation;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<DescContainer> createState() => _DescContainerState();
|
State<DescContainer> createState() => _DescContainerState();
|
||||||
|
@ -51,29 +57,29 @@ class _DescContainerState extends State<DescContainer> {
|
||||||
alignment: WrapAlignment.spaceEvenly,
|
alignment: WrapAlignment.spaceEvenly,
|
||||||
spacing: 5,
|
spacing: 5,
|
||||||
children: [
|
children: [
|
||||||
widget.humidity == null
|
widget.dewpoint2M == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/humidity.png',
|
imageName: 'assets/images/dew.png',
|
||||||
value: '${widget.humidity}%',
|
value: statusData.getDegree(widget.dewpoint2M?.round()),
|
||||||
desc: 'humidity'.tr,
|
desc: 'dewpoint'.tr,
|
||||||
),
|
),
|
||||||
widget.feels == null
|
widget.feels == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/temperature.png',
|
imageName: 'assets/images/temperature.png',
|
||||||
value: statusData.getDegree(widget.feels?.round()),
|
value: statusData.getDegree(widget.feels?.round()),
|
||||||
desc: 'feels'.tr,
|
desc: 'feels'.tr,
|
||||||
),
|
),
|
||||||
widget.visibility == null
|
widget.visibility == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/fog.png',
|
imageName: 'assets/images/fog.png',
|
||||||
value: statusData.getVisibility(widget.visibility),
|
value: statusData.getVisibility(widget.visibility),
|
||||||
desc: 'visibility'.tr,
|
desc: 'visibility'.tr,
|
||||||
),
|
),
|
||||||
widget.direction == null
|
widget.direction == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/windsock.png',
|
imageName: 'assets/images/windsock.png',
|
||||||
value: '${widget.direction}°',
|
value: '${widget.direction}°',
|
||||||
|
@ -81,21 +87,21 @@ class _DescContainerState extends State<DescContainer> {
|
||||||
message: message.getDirection(widget.direction),
|
message: message.getDirection(widget.direction),
|
||||||
),
|
),
|
||||||
widget.wind == null
|
widget.wind == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/wind.png',
|
imageName: 'assets/images/wind.png',
|
||||||
value: statusData.getSpeed(widget.wind?.round()),
|
value: statusData.getSpeed(widget.wind?.round()),
|
||||||
desc: 'wind'.tr,
|
desc: 'wind'.tr,
|
||||||
),
|
),
|
||||||
widget.windgusts == null
|
widget.windgusts == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/windgusts.png',
|
imageName: 'assets/images/windgusts.png',
|
||||||
value: statusData.getSpeed(widget.windgusts?.round()),
|
value: statusData.getSpeed(widget.windgusts?.round()),
|
||||||
desc: 'windgusts'.tr,
|
desc: 'windgusts'.tr,
|
||||||
),
|
),
|
||||||
widget.evaporation == null
|
widget.evaporation == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/evaporation.png',
|
imageName: 'assets/images/evaporation.png',
|
||||||
value:
|
value:
|
||||||
|
@ -103,28 +109,42 @@ class _DescContainerState extends State<DescContainer> {
|
||||||
desc: 'evaporation'.tr,
|
desc: 'evaporation'.tr,
|
||||||
),
|
),
|
||||||
widget.precipitation == null
|
widget.precipitation == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/rainfall.png',
|
imageName: 'assets/images/rainfall.png',
|
||||||
value: statusData.getPrecipitation(widget.precipitation),
|
value: statusData.getPrecipitation(widget.precipitation),
|
||||||
desc: 'precipitation'.tr,
|
desc: 'precipitation'.tr,
|
||||||
),
|
),
|
||||||
widget.rain == null
|
widget.rain == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/water.png',
|
imageName: 'assets/images/water.png',
|
||||||
value: statusData.getPrecipitation(widget.rain),
|
value: statusData.getPrecipitation(widget.rain),
|
||||||
desc: 'rain'.tr,
|
desc: 'rain'.tr,
|
||||||
),
|
),
|
||||||
|
widget.precipitationProbability == null
|
||||||
|
? const Offstage()
|
||||||
|
: DescWeather(
|
||||||
|
imageName: 'assets/images/precipitation_probability.png',
|
||||||
|
value: '${widget.precipitationProbability}%',
|
||||||
|
desc: 'precipitationProbabilit'.tr,
|
||||||
|
),
|
||||||
|
widget.humidity == null
|
||||||
|
? const Offstage()
|
||||||
|
: DescWeather(
|
||||||
|
imageName: 'assets/images/humidity.png',
|
||||||
|
value: '${widget.humidity}%',
|
||||||
|
desc: 'humidity'.tr,
|
||||||
|
),
|
||||||
widget.cloudcover == null
|
widget.cloudcover == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/cloudy.png',
|
imageName: 'assets/images/cloudy.png',
|
||||||
value: '${widget.cloudcover}%',
|
value: '${widget.cloudcover}%',
|
||||||
desc: 'cloudcover'.tr,
|
desc: 'cloudcover'.tr,
|
||||||
),
|
),
|
||||||
widget.pressure == null
|
widget.pressure == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/atmospheric.png',
|
imageName: 'assets/images/atmospheric.png',
|
||||||
value: '${widget.pressure?.round()} ${'hPa'.tr}',
|
value: '${widget.pressure?.round()} ${'hPa'.tr}',
|
||||||
|
@ -132,13 +152,20 @@ class _DescContainerState extends State<DescContainer> {
|
||||||
message: message.getPressure(widget.pressure?.round()),
|
message: message.getPressure(widget.pressure?.round()),
|
||||||
),
|
),
|
||||||
widget.uvIndex == null
|
widget.uvIndex == null
|
||||||
? Container()
|
? const Offstage()
|
||||||
: DescWeather(
|
: DescWeather(
|
||||||
imageName: 'assets/images/uv.png',
|
imageName: 'assets/images/uv.png',
|
||||||
value: '${widget.uvIndex?.round()}',
|
value: '${widget.uvIndex?.round()}',
|
||||||
desc: 'uvIndex'.tr,
|
desc: 'uvIndex'.tr,
|
||||||
message: message.getUvIndex(widget.uvIndex?.round()),
|
message: message.getUvIndex(widget.uvIndex?.round()),
|
||||||
),
|
),
|
||||||
|
widget.shortwaveRadiation == null
|
||||||
|
? const Offstage()
|
||||||
|
: DescWeather(
|
||||||
|
imageName: 'assets/images/shortwave_radiation.png',
|
||||||
|
value: '${widget.shortwaveRadiation?.round()} ${'W/m2'.tr}',
|
||||||
|
desc: 'shortwaveRadiation'.tr,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -115,6 +115,9 @@ class Translation extends Translations {
|
||||||
'widget': 'Виджет',
|
'widget': 'Виджет',
|
||||||
'widgetBackground': 'Фон виджета',
|
'widgetBackground': 'Фон виджета',
|
||||||
'widgetText': 'Текст виджета',
|
'widgetText': 'Текст виджета',
|
||||||
|
'dewpoint': 'Точка росы',
|
||||||
|
'shortwaveRadiation': 'Коротковолновое излучение',
|
||||||
|
'W/m2': 'Вт/м2',
|
||||||
},
|
},
|
||||||
'en_US': {
|
'en_US': {
|
||||||
'start': 'Get Started',
|
'start': 'Get Started',
|
||||||
|
@ -228,6 +231,9 @@ class Translation extends Translations {
|
||||||
'widget': 'Widget',
|
'widget': 'Widget',
|
||||||
'widgetBackground': 'Widget background',
|
'widgetBackground': 'Widget background',
|
||||||
'widgetText': 'Widget text',
|
'widgetText': 'Widget text',
|
||||||
|
'dewpoint': 'Dewpoint',
|
||||||
|
'shortwaveRadiation': 'Shortwave radiation',
|
||||||
|
'W/m2': 'W/m2',
|
||||||
},
|
},
|
||||||
'fr_FR': {
|
'fr_FR': {
|
||||||
'start': 'Démarrer',
|
'start': 'Démarrer',
|
||||||
|
@ -342,6 +348,8 @@ class Translation extends Translations {
|
||||||
'widget': 'Widget',
|
'widget': 'Widget',
|
||||||
'widgetBackground': 'Fond du widget',
|
'widgetBackground': 'Fond du widget',
|
||||||
'widgetText': 'Texte du widget',
|
'widgetText': 'Texte du widget',
|
||||||
|
'dewpoint': 'Point de rosée',
|
||||||
|
'shortwaveRadiation': 'Rayonnement à ondes courtes',
|
||||||
},
|
},
|
||||||
'it_IT': {
|
'it_IT': {
|
||||||
'start': 'Clicca per iniziare',
|
'start': 'Clicca per iniziare',
|
||||||
|
@ -456,6 +464,8 @@ class Translation extends Translations {
|
||||||
'widget': 'Widget',
|
'widget': 'Widget',
|
||||||
'widgetBackground': 'Sfondo del widget',
|
'widgetBackground': 'Sfondo del widget',
|
||||||
'widgetText': 'Testo del widget',
|
'widgetText': 'Testo del widget',
|
||||||
|
'dewpoint': 'Punto di rugiada',
|
||||||
|
'shortwaveRadiation': 'Radiazione a onde corte',
|
||||||
},
|
},
|
||||||
'de_DE': {
|
'de_DE': {
|
||||||
'start': 'Los gehts',
|
'start': 'Los gehts',
|
||||||
|
@ -570,6 +580,8 @@ class Translation extends Translations {
|
||||||
'widget': 'Widget',
|
'widget': 'Widget',
|
||||||
'widgetBackground': 'Widget-Hintergrund',
|
'widgetBackground': 'Widget-Hintergrund',
|
||||||
'widgetText': 'Widget-Text',
|
'widgetText': 'Widget-Text',
|
||||||
|
'dewpoint': 'Taupunkt',
|
||||||
|
'shortwaveRadiation': 'Kurzwellenstrahlung',
|
||||||
},
|
},
|
||||||
'tr_TR': {
|
'tr_TR': {
|
||||||
'start': 'Başlat',
|
'start': 'Başlat',
|
||||||
|
@ -683,6 +695,8 @@ class Translation extends Translations {
|
||||||
'widget': 'Araç',
|
'widget': 'Araç',
|
||||||
'widgetBackground': 'Araç Arka Planı',
|
'widgetBackground': 'Araç Arka Planı',
|
||||||
'widgetText': 'Araç metni',
|
'widgetText': 'Araç metni',
|
||||||
|
'dewpoint': 'Çiğ noktası',
|
||||||
|
'shortwaveRadiation': 'Kısa dalga radyasyonu',
|
||||||
},
|
},
|
||||||
'pt_BR': {
|
'pt_BR': {
|
||||||
'start': 'Iniciar',
|
'start': 'Iniciar',
|
||||||
|
@ -796,6 +810,8 @@ class Translation extends Translations {
|
||||||
'widget': 'Widget',
|
'widget': 'Widget',
|
||||||
'widgetBackground': 'Fundo do widget',
|
'widgetBackground': 'Fundo do widget',
|
||||||
'widgetText': 'Texto do widget',
|
'widgetText': 'Texto do widget',
|
||||||
|
'dewpoint': 'Ponto de orvalho',
|
||||||
|
'shortwaveRadiation': 'Radiação de ondas curtas',
|
||||||
},
|
},
|
||||||
'es_ES': {
|
'es_ES': {
|
||||||
'start': 'Empezar',
|
'start': 'Empezar',
|
||||||
|
@ -814,7 +830,7 @@ class Translation extends Translations {
|
||||||
'direction': 'Dirección',
|
'direction': 'Dirección',
|
||||||
'pressure': 'Presión',
|
'pressure': 'Presión',
|
||||||
'rain': 'Lluvia',
|
'rain': 'Lluvia',
|
||||||
'clear_sky': 'Soleado',
|
'clear_sky': 'Cielo despejado',
|
||||||
'cloudy': 'Nuboso',
|
'cloudy': 'Nuboso',
|
||||||
'overcast': 'Cubierto de nubes',
|
'overcast': 'Cubierto de nubes',
|
||||||
'fog': 'Niebla',
|
'fog': 'Niebla',
|
||||||
|
@ -910,6 +926,8 @@ class Translation extends Translations {
|
||||||
'widget': 'Widget',
|
'widget': 'Widget',
|
||||||
'widgetBackground': 'Fondo del widget',
|
'widgetBackground': 'Fondo del widget',
|
||||||
'widgetText': 'Texto del widget',
|
'widgetText': 'Texto del widget',
|
||||||
|
'dewpoint': 'Punto de rocío',
|
||||||
|
'shortwaveRadiation': 'Radiación de onda corta',
|
||||||
},
|
},
|
||||||
'sk_SK': {
|
'sk_SK': {
|
||||||
'start': 'Začať',
|
'start': 'Začať',
|
||||||
|
@ -1023,6 +1041,8 @@ class Translation extends Translations {
|
||||||
'widget': 'Widget',
|
'widget': 'Widget',
|
||||||
'widgetBackground': 'Pozadie widgetu',
|
'widgetBackground': 'Pozadie widgetu',
|
||||||
'widgetText': 'Text widgetu',
|
'widgetText': 'Text widgetu',
|
||||||
|
'dewpoint': 'Rosný bod',
|
||||||
|
'shortwaveRadiation': 'Krátka vlnová radiácia',
|
||||||
},
|
},
|
||||||
'nl_NL': {
|
'nl_NL': {
|
||||||
'start': 'Beginnen',
|
'start': 'Beginnen',
|
||||||
|
@ -1137,6 +1157,8 @@ class Translation extends Translations {
|
||||||
'widget': 'Widget',
|
'widget': 'Widget',
|
||||||
'widgetBackground': 'Widget-achtergrond',
|
'widgetBackground': 'Widget-achtergrond',
|
||||||
'widgetText': 'Tekst van widget',
|
'widgetText': 'Tekst van widget',
|
||||||
|
'dewpoint': 'Dauwpunt',
|
||||||
|
'shortwaveRadiation': 'Korte golfstraling',
|
||||||
},
|
},
|
||||||
'hi_IN': {
|
'hi_IN': {
|
||||||
'start': 'शुरू करें',
|
'start': 'शुरू करें',
|
||||||
|
@ -1248,6 +1270,8 @@ class Translation extends Translations {
|
||||||
'widget': 'विजेट',
|
'widget': 'विजेट',
|
||||||
'widgetBackground': 'विजेट का पृष्ठभूमि',
|
'widgetBackground': 'विजेट का पृष्ठभूमि',
|
||||||
'widgetText': 'विजेट पाठ',
|
'widgetText': 'विजेट पाठ',
|
||||||
|
'dewpoint': 'बर्फ़ के बिंदु',
|
||||||
|
'shortwaveRadiation': 'शॉर्टवेव विकिरण',
|
||||||
},
|
},
|
||||||
'ro_RO': {
|
'ro_RO': {
|
||||||
'start': 'Începe',
|
'start': 'Începe',
|
||||||
|
@ -1360,6 +1384,8 @@ class Translation extends Translations {
|
||||||
'widget': 'Widget',
|
'widget': 'Widget',
|
||||||
'widgetBackground': 'Fundal widget',
|
'widgetBackground': 'Fundal widget',
|
||||||
'widgetText': 'Text widget',
|
'widgetText': 'Text widget',
|
||||||
|
'dewpoint': 'Punct de rouă',
|
||||||
|
'shortwaveRadiation': 'Radiație cu unde scurte',
|
||||||
},
|
},
|
||||||
'zh_CN': {
|
'zh_CN': {
|
||||||
'start': '开始',
|
'start': '开始',
|
||||||
|
@ -1470,6 +1496,8 @@ class Translation extends Translations {
|
||||||
'widget': '小部件',
|
'widget': '小部件',
|
||||||
'widgetBackground': '小部件背景',
|
'widgetBackground': '小部件背景',
|
||||||
'widgetText': '小部件文本',
|
'widgetText': '小部件文本',
|
||||||
|
'dewpoint': '露点',
|
||||||
|
'shortwaveRadiation': '短波辐射',
|
||||||
},
|
},
|
||||||
'pl_PL': {
|
'pl_PL': {
|
||||||
'start': 'Rozpocznij',
|
'start': 'Rozpocznij',
|
||||||
|
@ -1581,7 +1609,9 @@ class Translation extends Translations {
|
||||||
'license': 'Licencje',
|
'license': 'Licencje',
|
||||||
'widget': 'Widget',
|
'widget': 'Widget',
|
||||||
'widgetBackground': 'Tło widżetu',
|
'widgetBackground': 'Tło widżetu',
|
||||||
'widgetText': 'Tekst widżetu'
|
'widgetText': 'Tekst widżetu',
|
||||||
|
'dewpoint': 'Punkt rosy',
|
||||||
|
'shortwaveRadiation': 'Promieniowanie krótkofalowe',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
FlutterTimezonePlugin.register(with: registry.registrar(forPlugin: "FlutterTimezonePlugin"))
|
FlutterTimezonePlugin.register(with: registry.registrar(forPlugin: "FlutterTimezonePlugin"))
|
||||||
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
|
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
|
||||||
IsarFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "IsarFlutterLibsPlugin"))
|
IsarFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "IsarFlutterLibsPlugin"))
|
||||||
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
|
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
||||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||||
}
|
}
|
||||||
|
|
12
pubspec.lock
12
pubspec.lock
|
@ -165,10 +165,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: connectivity_plus
|
name: connectivity_plus
|
||||||
sha256: "94d51c6f1299133a2baa4c5c3d2c11ec7d7fb4768dee5c52a56f7d7522fcf70e"
|
sha256: b502a681ba415272ecc41400bd04fe543ed1a62632137dc84d25a91e7746f55f
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.0.0"
|
version: "5.0.1"
|
||||||
connectivity_plus_platform_interface:
|
connectivity_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -364,10 +364,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_timezone
|
name: flutter_timezone
|
||||||
sha256: "4508018aba499c837f723e2e718259eb677410490638b7ea669b11113d083e68"
|
sha256: "06b35132c98fa188db3c4b654b7e1af7ccd01dfe12a004d58be423357605fb24"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.7"
|
version: "1.0.8"
|
||||||
flutter_web_plugins:
|
flutter_web_plugins:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -681,10 +681,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: package_info_plus
|
name: package_info_plus
|
||||||
sha256: "6ff267fcd9d48cb61c8df74a82680e8b82e940231bb5f68356672fde0397334a"
|
sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.1.0"
|
version: "4.2.0"
|
||||||
package_info_plus_platform_interface:
|
package_info_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -30,9 +30,9 @@ dependencies:
|
||||||
url_launcher: ^6.1.14
|
url_launcher: ^6.1.14
|
||||||
dynamic_color: ^1.6.7
|
dynamic_color: ^1.6.7
|
||||||
path_provider: ^2.1.1
|
path_provider: ^2.1.1
|
||||||
flutter_timezone: ^1.0.7
|
flutter_timezone: ^1.0.8
|
||||||
package_info_plus: ^4.1.0
|
package_info_plus: ^4.2.0
|
||||||
connectivity_plus: ^5.0.0
|
connectivity_plus: ^5.0.1
|
||||||
isar_flutter_libs: ^3.1.0+1
|
isar_flutter_libs: ^3.1.0+1
|
||||||
flutter_displaymode: ^0.6.0
|
flutter_displaymode: ^0.6.0
|
||||||
lat_lng_to_timezone: ^0.2.0
|
lat_lng_to_timezone: ^0.2.0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue