weather_pack 1.0.1 copy "weather_pack: ^1.0.1" to clipboard
weather_pack: ^1.0.1 copied to clipboard

The project is designed to obtain weather via the OpenWeatherMap API. With geocoding and units measure. :)

telegram_badge pub_badge repo_star_badge mit_license_badge code_size_badge

🌦 weather_pack #

A quick way to get access to weather conditions.


Why choose this library?

basic:

  1. 🚲 Easy to use - you only need the APIKEY.
  2. 🏝 Built-in geocoding - search for locations by assumed names or by coordinates.
  3. 🩺 Various units of measurement - speed, temperature, pressure and cardinal points.
  4. 🌤 There are original weather icons.
advanced: (Click to open)
  1. 🔮 At least one release application is already based on this package. Therefore, there is an additional guarantee of security and timely updates of this package.
  2. 🔓 There is a method for checking your api for correctness.
  3. 🧱 It is very easy to customize data models. Create your own data models and take only what you need from the built-in ones.
  4. 🧾 The code is well documented and each class is labeled and decoded. There are unit tests for the main functions of the package.
  5. 🦺 Safe unpacking of types. If the server stops outputting values - your weather model will have a null field and the application will not crash.
  6. 🔧 This package has no unnecessary dependencies and contains minimal code. Also, all platforms are supported.

Endpoints openweathermap.org #

Let's agree to designate Openweathermap as OWM.

The library uses the following site endpoints openweathermap.org:

Endpoint or Path A class or method that uses this endpoint See more
api.openweathermap.org/data/2.5/weather WeatherService.currentWeatherByLocation current
api.openweathermap.org/data/2.5/onecall WeatherService.oneCallWeatherByLocation one-call-api
api.openweathermap.org/geo/1.0/direct GeocodingService.getLocationByCityName geocoding-direct
api.openweathermap.org/geo/1.0/reverse GeocodingService.getLocationByCoordinates geocoding-reverse

Table of Contents #

Installing #

  1. Add dependency to your pubspec.yaml:
    dependencies:
      weather_pack: ^<latest_version>
    
  2. Run the command: flutter pub get
  3. Use in your code:
    import 'package:weather_pack/weather_pack.dart';
    

Getting Started #

The easiest way to get the current weather:

Future<void> main() async {
  const api = 'YOUR_APIKEY'; // TODO: change to your Openweathermap APIkey
  final wService = WeatherService(api);

  // get the current weather in Amsterdam
  final WeatherCurrent currently = await wService.currentWeatherByLocation(
      latitude: 52.374, longitude: 4.88969);
  
  print(currently);
}

You can also change the request language:

final lang = WeatherLanguage.arabic;

final wService = WeatherService(api, language: lang);
Supported languages: (Click to open)
  1. Afrikaans
  2. Albanian
  3. Arabic
  4. Azerbaijani
  5. Bulgarian
  6. Catalan
  7. Czech
  8. Danish
  9. German
  10. Greek
  11. English
  12. Basque
  13. Persian
  14. Farsi
  15. Finnish
  16. French
  17. Galician
  18. Hebrew
  19. Hindi
  20. Croatian
  21. Hungarian
  22. Indonesian
  23. Italian
  24. Japanese
  25. Korean
  26. Latvian
  27. Latvian
  28. Macedonian
  29. Norwegian
  30. Dutch
  31. Polish
  32. Portuguese
  33. Português Brasil
  34. Romanian
  35. Russian
  36. Swedish
  37. Slovak
  38. Slovenian
  39. Spanish
  40. Serbian
  41. Thai
  42. Turkish
  43. Ukrainian
  44. Vietnamese
  45. Chinese Simplified
  46. Chinese Traditional
  47. Zulu

According to OWM service (See more):

You can use the lang parameter to get the output in your language.

Translation is applied for the city name and description fields.

Usage weather service #

Now there are two weather models - WeatherCurrent and WeatherOneCall.

WeatherOneCall includes:

  1. WeatherCurrent
  2. List<WeatherHourly>
  3. List<WeatherMinutely>
  4. List<WeatherDaily>
  5. List<WeatherAlert>

How to use?

You can get the weather in the following way:

final WeatherCurrent current = await wService
    .currentWeatherByLocation(latitude: 52.374, longitude: 4.88969);

final WeatherOneCall onecall = await wService
    .oneCallWeatherByLocation(latitude: 52.374, longitude: 4.88969);

Why do you only use the weather search by coordinates?

According to the website OWM:

Please use Geocoder API if you need automatic convert city names and zip-codes to geo coordinates and the other way around.

Please note that built-in geocoder has been deprecated. Although it is still available for use, bug fixing and updates are no longer available for this functionality.

Usage geocoding service #

GeocodingService is a service for easy location search when working with geographical names and coordinates. Supports both the direct and reverse methods:

  • Direct geocoding converts the specified name of a location or zip/post code into the exact geographical coordinates;
  • Reverse geocoding converts the geographical coordinates into the names of the nearby locations;

You can find out more at this link: Geocoding API OpenWeather

How to use?

Create GeocodingService in the following way:

final String cityName = 'suggested location name';
final String apiKey = 'your api key for OWM';

final GeocodingService gService = GeocodingService(apiKey);

To find using place names use direct geocoding:

final List<PlaceGeocode> places = await gService.getLocationByCityName(cityName);

or use reverse geocoding

final List<PlaceGeocode> places = await gService.getLocationByCoordinates(latitude: 52.374, longitude: 4.88969);

Usage units measure #

By default, all weather models, e.g. WeatherCurrent, have measurable values of type double. To display the data in a convenient format, it is necessary use the conversion method value or valueToString:

void worksTempUnits({
  double temp = 270.78, // ex. received from [WeatherCurrent.temp]
  int precision = 3,
  Temp unitsMeasure = Temp.celsius,
}) {
  // The default temperature is measured in Kelvin of the `double` type.
  // We need the temperature to be displayed in Celsius to 3 decimal places

  print(unitsMeasure.value(temp, precision)); // `-2.37` type `double`
  print(unitsMeasure.valueToString(temp, precision)); // `-2.370` type `String`

  // if precision is 0:
  print(unitsMeasure.value(temp, 0)); // `-2.0` type `double`
  print(unitsMeasure.valueToString(temp, 0)); // `-2` type `String`
}

By and large, the valueToString() method is needed to display correctly in ui, and the value() method is for accurate calculations.

There are several units of measurement:

Units of measure Class Supported units Conversion
Temperature Temp kelvin, celsius, fahrenheit +
Speed Speed ms, mph, kph +
Pressure Pressure hectoPa, mbar, mmHg, kPa, atm, inHg +
Cardinal points SideOfTheWorld n, ne, e, se, s, sw, w, nw +(another)

💡 Tip: The SideOfTheWorld enum contains a static method fromDegrees() for converting degrees to cardinal directions.

Usage weather icons #

You can use weather icons provided by the OWM service. See more about weather conditions.

Icons are stored locally in this package at the path assets/weather_icons/. They are ordered according to Declaring resolution-aware image assets. This reflects the following correspondences:

100*100 - in default(implied resolution @1)
200x200 - @2
300x300 - @3
400x400 - @4

with the preservation of image quality.

How to use?

Get the weather icon in a safe way:

Image getWeatherIcon(String weatherIcon) {
  return Image.asset(
    ImagePathWeather.getPathWeatherIcon(weatherIcon),
    filterQuality: FilterQuality.high, // optional
    package: ImagePathWeather.packageName,
  );
}

or to process it completely by hand:

Widget getWeatherIcon(WeatherCurrent weather) {
  return Image.asset(
    'assets/weather_icons/${weather.weatherIcon}.png', // icon path
    package: 'weather_pack', // name package
    filterQuality: FilterQuality.high, // optional
    errorBuilder: (c, e, s) => Text(e), // will return the widget in case of an error
  );
}

By and large, you can use the best quality regardless of platform resolution by specifying @4 to path:

'assets/weather_icons/@4/$weatherIcon.png'

API key testing #

It is possible to test the API key. To do this, the OWMApiTest class has a method isCorrectApiKey():

void worksTestedAPIkey({
  String testedAPIkey = 'Your_key',
}) async {

  // If the key is correct, it will return `true`
  final bool isCorrect = await OWMApiTest().isCorrectApiKey(testedAPIkey);
}

Resources #

  • folder example. There is a simple example of how to use the basic functions of the package, as well as a console mini-application without using flutter
    • habr_badge
    • medium_badge

Feel free to suggest materials for inclusion in this list ^_~

Features in development #

  • ?Getting weather by location name (built-in geocoding)
  • ?Ability to get icons directly from openweathermap service
  • ?Designate all kinds of icons in a static way, e.g. via enum

Additional information #

Made with ❤️. Enjoy it!


🏷 tags: weather, openWeather, openweathermap, weather forecast, metcast, W/F, reverse/direct geocoding, units measure, temperature, pressure, speed
10
likes
140
pub points
66%
popularity
screenshot

Publisher

unverified uploader

The project is designed to obtain weather via the OpenWeatherMap API. With geocoding and units measure. :)

Homepage
Repository (GitHub)
View/report issues

Topics

#weather #openweathermap #geocoding #weather-forecast #units-measure

Documentation

API reference

Funding

Consider supporting this project:

t.me

License

MIT (LICENSE)

Dependencies

http, meta

More

Packages that depend on weather_pack