From 33ceb30885cb594b3a7c6b413ff9b97b4b1f12f2 Mon Sep 17 00:00:00 2001 From: Yoshi Date: Sat, 13 Jul 2024 07:00:58 +0300 Subject: [PATCH] Fix api code --- lib/app/api/api.dart | 216 +++++++++++++++-------------- lib/app/controller/controller.dart | 8 +- pubspec.yaml | 2 +- 3 files changed, 116 insertions(+), 110 deletions(-) diff --git a/lib/app/api/api.dart b/lib/app/api/api.dart index 0872812..8cf7b8e 100644 --- a/lib/app/api/api.dart +++ b/lib/app/api/api.dart @@ -11,59 +11,28 @@ class WeatherAPI { ..options.baseUrl = 'https://api.open-meteo.com/v1/forecast?'; final Dio dioLocation = Dio(); - Future getWeatherData(double? lat, double? lon) async { - 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,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; - settings.measurements == 'imperial' && settings.degrees == 'fahrenheit' - ? urlWeather = - '$url&temperature_unit=fahrenheit&windspeed_unit=mph&precipitation_unit=inch' - : settings.measurements == 'imperial' - ? urlWeather = '$url&windspeed_unit=mph&precipitation_unit=inch' - : settings.degrees == 'fahrenheit' - ? urlWeather = '$url&temperature_unit=fahrenheit' - : urlWeather = url; + static const String _weatherParams = + '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 _buildWeatherUrl(double lat, double lon) { + String url = 'latitude=$lat&longitude=$lon&$_weatherParams'; + if (settings.measurements == 'imperial') { + url += '&windspeed_unit=mph&precipitation_unit=inch'; + } + if (settings.degrees == 'fahrenheit') { + url += '&temperature_unit=fahrenheit'; + } + return url; + } + + Future getWeatherData(double lat, double lon) async { + final String urlWeather = _buildWeatherUrl(lat, lon); try { Response response = await dio.get(urlWeather); WeatherDataApi weatherData = WeatherDataApi.fromJson(response.data); - return MainWeatherCache( - time: weatherData.hourly.time, - temperature2M: weatherData.hourly.temperature2M, - relativehumidity2M: weatherData.hourly.relativeHumidity2M, - apparentTemperature: weatherData.hourly.apparentTemperature, - precipitation: weatherData.hourly.precipitation, - rain: weatherData.hourly.rain, - weathercode: weatherData.hourly.weatherCode, - surfacePressure: weatherData.hourly.surfacePressure, - visibility: weatherData.hourly.visibility, - evapotranspiration: weatherData.hourly.evapotranspiration, - windspeed10M: weatherData.hourly.windSpeed10M, - winddirection10M: weatherData.hourly.windDirection10M, - windgusts10M: weatherData.hourly.windGusts10M, - cloudcover: weatherData.hourly.cloudCover, - uvIndex: weatherData.hourly.uvIndex, - dewpoint2M: weatherData.hourly.dewpoint2M, - precipitationProbability: weatherData.hourly.precipitationProbability, - shortwaveRadiation: weatherData.hourly.shortwaveRadiation, - timeDaily: weatherData.daily.time, - weathercodeDaily: weatherData.daily.weatherCode, - temperature2MMax: weatherData.daily.temperature2MMax, - temperature2MMin: weatherData.daily.temperature2MMin, - apparentTemperatureMax: weatherData.daily.apparentTemperatureMax, - apparentTemperatureMin: weatherData.daily.apparentTemperatureMin, - sunrise: weatherData.daily.sunrise, - sunset: weatherData.daily.sunset, - precipitationSum: weatherData.daily.precipitationSum, - precipitationProbabilityMax: - weatherData.daily.precipitationProbabilityMax, - windspeed10MMax: weatherData.daily.windSpeed10MMax, - windgusts10MMax: weatherData.daily.windGusts10MMax, - uvIndexMax: weatherData.daily.uvIndexMax, - rainSum: weatherData.daily.rainSum, - winddirection10MDominant: weatherData.daily.windDirection10MDominant, - timezone: weatherData.timezone, - timestamp: DateTime.now(), - ); + return _mapWeatherDataToCache(weatherData); } on DioException catch (e) { if (kDebugMode) { print(e); @@ -72,64 +41,14 @@ class WeatherAPI { } } - Future getWeatherCard(double? lat, double? lon, String city, + Future getWeatherCard(double lat, double lon, String city, String district, String timezone) async { - 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,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; - settings.measurements == 'imperial' && settings.degrees == 'fahrenheit' - ? urlWeather = - '$url&temperature_unit=fahrenheit&windspeed_unit=mph&precipitation_unit=inch' - : settings.measurements == 'imperial' - ? urlWeather = '$url&windspeed_unit=mph&precipitation_unit=inch' - : settings.degrees == 'fahrenheit' - ? urlWeather = '$url&temperature_unit=fahrenheit' - : urlWeather = url; + final String urlWeather = _buildWeatherUrl(lat, lon); try { Response response = await dio.get(urlWeather); WeatherDataApi weatherData = WeatherDataApi.fromJson(response.data); - return WeatherCard( - time: weatherData.hourly.time, - temperature2M: weatherData.hourly.temperature2M, - relativehumidity2M: weatherData.hourly.relativeHumidity2M, - apparentTemperature: weatherData.hourly.apparentTemperature, - precipitation: weatherData.hourly.precipitation, - rain: weatherData.hourly.rain, - weathercode: weatherData.hourly.weatherCode, - surfacePressure: weatherData.hourly.surfacePressure, - visibility: weatherData.hourly.visibility, - evapotranspiration: weatherData.hourly.evapotranspiration, - windspeed10M: weatherData.hourly.windSpeed10M, - winddirection10M: weatherData.hourly.windDirection10M, - windgusts10M: weatherData.hourly.windGusts10M, - cloudcover: weatherData.hourly.cloudCover, - uvIndex: weatherData.hourly.uvIndex, - dewpoint2M: weatherData.hourly.dewpoint2M, - precipitationProbability: weatherData.hourly.precipitationProbability, - shortwaveRadiation: weatherData.hourly.shortwaveRadiation, - timeDaily: weatherData.daily.time, - weathercodeDaily: weatherData.daily.weatherCode, - temperature2MMax: weatherData.daily.temperature2MMax, - temperature2MMin: weatherData.daily.temperature2MMin, - apparentTemperatureMax: weatherData.daily.apparentTemperatureMax, - apparentTemperatureMin: weatherData.daily.apparentTemperatureMin, - sunrise: weatherData.daily.sunrise, - sunset: weatherData.daily.sunset, - precipitationSum: weatherData.daily.precipitationSum, - precipitationProbabilityMax: - weatherData.daily.precipitationProbabilityMax, - windspeed10MMax: weatherData.daily.windSpeed10MMax, - windgusts10MMax: weatherData.daily.windGusts10MMax, - uvIndexMax: weatherData.daily.uvIndexMax, - rainSum: weatherData.daily.rainSum, - winddirection10MDominant: weatherData.daily.windDirection10MDominant, - lat: lat, - lon: lon, - city: city, - district: district, - timezone: timezone, - timestamp: DateTime.now(), - ); + return _mapWeatherDataToCard( + weatherData, lat, lon, city, district, timezone); } on DioException catch (e) { if (kDebugMode) { print(e); @@ -139,7 +58,7 @@ class WeatherAPI { } Future> getCity(String query, Locale? locale) async { - final url = + final String url = 'https://geocoding-api.open-meteo.com/v1/search?name=$query&count=5&language=${locale?.languageCode}&format=json'; try { Response response = await dioLocation.get(url); @@ -163,4 +82,91 @@ class WeatherAPI { rethrow; } } + + MainWeatherCache _mapWeatherDataToCache(WeatherDataApi weatherData) { + return MainWeatherCache( + time: weatherData.hourly.time, + temperature2M: weatherData.hourly.temperature2M, + relativehumidity2M: weatherData.hourly.relativeHumidity2M, + apparentTemperature: weatherData.hourly.apparentTemperature, + precipitation: weatherData.hourly.precipitation, + rain: weatherData.hourly.rain, + weathercode: weatherData.hourly.weatherCode, + surfacePressure: weatherData.hourly.surfacePressure, + visibility: weatherData.hourly.visibility, + evapotranspiration: weatherData.hourly.evapotranspiration, + windspeed10M: weatherData.hourly.windSpeed10M, + winddirection10M: weatherData.hourly.windDirection10M, + windgusts10M: weatherData.hourly.windGusts10M, + cloudcover: weatherData.hourly.cloudCover, + uvIndex: weatherData.hourly.uvIndex, + dewpoint2M: weatherData.hourly.dewpoint2M, + precipitationProbability: weatherData.hourly.precipitationProbability, + shortwaveRadiation: weatherData.hourly.shortwaveRadiation, + timeDaily: weatherData.daily.time, + weathercodeDaily: weatherData.daily.weatherCode, + temperature2MMax: weatherData.daily.temperature2MMax, + temperature2MMin: weatherData.daily.temperature2MMin, + apparentTemperatureMax: weatherData.daily.apparentTemperatureMax, + apparentTemperatureMin: weatherData.daily.apparentTemperatureMin, + sunrise: weatherData.daily.sunrise, + sunset: weatherData.daily.sunset, + precipitationSum: weatherData.daily.precipitationSum, + precipitationProbabilityMax: + weatherData.daily.precipitationProbabilityMax, + windspeed10MMax: weatherData.daily.windSpeed10MMax, + windgusts10MMax: weatherData.daily.windGusts10MMax, + uvIndexMax: weatherData.daily.uvIndexMax, + rainSum: weatherData.daily.rainSum, + winddirection10MDominant: weatherData.daily.windDirection10MDominant, + timezone: weatherData.timezone, + timestamp: DateTime.now(), + ); + } + + WeatherCard _mapWeatherDataToCard(WeatherDataApi weatherData, double lat, + double lon, String city, String district, String timezone) { + return WeatherCard( + time: weatherData.hourly.time, + temperature2M: weatherData.hourly.temperature2M, + relativehumidity2M: weatherData.hourly.relativeHumidity2M, + apparentTemperature: weatherData.hourly.apparentTemperature, + precipitation: weatherData.hourly.precipitation, + rain: weatherData.hourly.rain, + weathercode: weatherData.hourly.weatherCode, + surfacePressure: weatherData.hourly.surfacePressure, + visibility: weatherData.hourly.visibility, + evapotranspiration: weatherData.hourly.evapotranspiration, + windspeed10M: weatherData.hourly.windSpeed10M, + winddirection10M: weatherData.hourly.windDirection10M, + windgusts10M: weatherData.hourly.windGusts10M, + cloudcover: weatherData.hourly.cloudCover, + uvIndex: weatherData.hourly.uvIndex, + dewpoint2M: weatherData.hourly.dewpoint2M, + precipitationProbability: weatherData.hourly.precipitationProbability, + shortwaveRadiation: weatherData.hourly.shortwaveRadiation, + timeDaily: weatherData.daily.time, + weathercodeDaily: weatherData.daily.weatherCode, + temperature2MMax: weatherData.daily.temperature2MMax, + temperature2MMin: weatherData.daily.temperature2MMin, + apparentTemperatureMax: weatherData.daily.apparentTemperatureMax, + apparentTemperatureMin: weatherData.daily.apparentTemperatureMin, + sunrise: weatherData.daily.sunrise, + sunset: weatherData.daily.sunset, + precipitationSum: weatherData.daily.precipitationSum, + precipitationProbabilityMax: + weatherData.daily.precipitationProbabilityMax, + windspeed10MMax: weatherData.daily.windSpeed10MMax, + windgusts10MMax: weatherData.daily.windGusts10MMax, + uvIndexMax: weatherData.daily.uvIndexMax, + rainSum: weatherData.daily.rainSum, + winddirection10MDominant: weatherData.daily.windDirection10MDominant, + lat: lat, + lon: lon, + city: city, + district: district, + timezone: timezone, + timestamp: DateTime.now(), + ); + } } diff --git a/lib/app/controller/controller.dart b/lib/app/controller/controller.dart index 56149f2..11e145e 100644 --- a/lib/app/controller/controller.dart +++ b/lib/app/controller/controller.dart @@ -316,8 +316,8 @@ class WeatherController extends GetxController { } for (var oldCard in weatherCard) { - var updatedCard = await WeatherAPI().getWeatherCard(oldCard.lat, - oldCard.lon, oldCard.city!, oldCard.district!, oldCard.timezone!); + var updatedCard = await WeatherAPI().getWeatherCard(oldCard.lat!, + oldCard.lon!, oldCard.city!, oldCard.district!, oldCard.timezone!); isar.writeTxnSync(() { oldCard ..time = updatedCard.time @@ -372,8 +372,8 @@ class WeatherController extends GetxController { } final updatedCard = await WeatherAPI().getWeatherCard( - weatherCard.lat, - weatherCard.lon, + weatherCard.lat!, + weatherCard.lon!, weatherCard.city!, weatherCard.district!, weatherCard.timezone!, diff --git a/pubspec.yaml b/pubspec.yaml index 7e6b1ba..ba187cb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: Weather application publish_to: "none" -version: 1.3.2+35 +version: 1.3.4+37 environment: sdk: ">=3.4.3 <4.0.0"