Fix api code

This commit is contained in:
Yoshi 2024-07-13 07:00:58 +03:00
parent 46e1546e5b
commit 33ceb30885
3 changed files with 116 additions and 110 deletions

View file

@ -11,59 +11,28 @@ class WeatherAPI {
..options.baseUrl = 'https://api.open-meteo.com/v1/forecast?'; ..options.baseUrl = 'https://api.open-meteo.com/v1/forecast?';
final Dio dioLocation = Dio(); final Dio dioLocation = Dio();
Future<MainWeatherCache> getWeatherData(double? lat, double? lon) async { static const String _weatherParams =
String url = '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'
'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'; '&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'
String urlWeather; '&forecast_days=12&timezone=auto';
settings.measurements == 'imperial' && settings.degrees == 'fahrenheit'
? urlWeather = String _buildWeatherUrl(double lat, double lon) {
'$url&temperature_unit=fahrenheit&windspeed_unit=mph&precipitation_unit=inch' String url = 'latitude=$lat&longitude=$lon&$_weatherParams';
: settings.measurements == 'imperial' if (settings.measurements == 'imperial') {
? urlWeather = '$url&windspeed_unit=mph&precipitation_unit=inch' url += '&windspeed_unit=mph&precipitation_unit=inch';
: settings.degrees == 'fahrenheit' }
? urlWeather = '$url&temperature_unit=fahrenheit' if (settings.degrees == 'fahrenheit') {
: urlWeather = url; url += '&temperature_unit=fahrenheit';
}
return url;
}
Future<MainWeatherCache> getWeatherData(double lat, double lon) async {
final String urlWeather = _buildWeatherUrl(lat, lon);
try { try {
Response response = await dio.get(urlWeather); Response response = await dio.get(urlWeather);
WeatherDataApi weatherData = WeatherDataApi.fromJson(response.data); WeatherDataApi weatherData = WeatherDataApi.fromJson(response.data);
return MainWeatherCache( return _mapWeatherDataToCache(weatherData);
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(),
);
} on DioException catch (e) { } on DioException catch (e) {
if (kDebugMode) { if (kDebugMode) {
print(e); print(e);
@ -72,64 +41,14 @@ 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 = final String urlWeather = _buildWeatherUrl(lat, lon);
'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;
try { try {
Response response = await dio.get(urlWeather); Response response = await dio.get(urlWeather);
WeatherDataApi weatherData = WeatherDataApi.fromJson(response.data); WeatherDataApi weatherData = WeatherDataApi.fromJson(response.data);
return WeatherCard( return _mapWeatherDataToCard(
time: weatherData.hourly.time, weatherData, lat, lon, city, district, timezone);
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(),
);
} on DioException catch (e) { } on DioException catch (e) {
if (kDebugMode) { if (kDebugMode) {
print(e); print(e);
@ -139,7 +58,7 @@ class WeatherAPI {
} }
Future<Iterable<Result>> getCity(String query, Locale? locale) async { Future<Iterable<Result>> 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'; 'https://geocoding-api.open-meteo.com/v1/search?name=$query&count=5&language=${locale?.languageCode}&format=json';
try { try {
Response response = await dioLocation.get(url); Response response = await dioLocation.get(url);
@ -163,4 +82,91 @@ class WeatherAPI {
rethrow; 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(),
);
}
} }

View file

@ -316,8 +316,8 @@ class WeatherController extends GetxController {
} }
for (var oldCard in weatherCard) { for (var oldCard in weatherCard) {
var updatedCard = await WeatherAPI().getWeatherCard(oldCard.lat, var updatedCard = await WeatherAPI().getWeatherCard(oldCard.lat!,
oldCard.lon, oldCard.city!, oldCard.district!, oldCard.timezone!); oldCard.lon!, oldCard.city!, oldCard.district!, oldCard.timezone!);
isar.writeTxnSync(() { isar.writeTxnSync(() {
oldCard oldCard
..time = updatedCard.time ..time = updatedCard.time
@ -372,8 +372,8 @@ class WeatherController extends GetxController {
} }
final updatedCard = await WeatherAPI().getWeatherCard( final updatedCard = await WeatherAPI().getWeatherCard(
weatherCard.lat, weatherCard.lat!,
weatherCard.lon, weatherCard.lon!,
weatherCard.city!, weatherCard.city!,
weatherCard.district!, weatherCard.district!,
weatherCard.timezone!, weatherCard.timezone!,

View file

@ -3,7 +3,7 @@ description: Weather application
publish_to: "none" publish_to: "none"
version: 1.3.2+35 version: 1.3.4+37
environment: environment:
sdk: ">=3.4.3 <4.0.0" sdk: ">=3.4.3 <4.0.0"