WeatherData.fromJson constructor

WeatherData.fromJson(
  1. Map<String, dynamic> json
)

//////////// //////////// Creates WeatherData from OpenWeatherMap API JSON response

Implementation

// II.C - Factory Methods
///////////////
/// Creates WeatherData from OpenWeatherMap API JSON response
factory WeatherData.fromJson(Map<String, dynamic> json) {
  try {
    // Extract precipitation (rain or snow)
    double precipitation = 0.0;
    if (json.containsKey('rain')) {
      final rainData = json['rain'];
      precipitation += rainData is Map ?
        (rainData['1h'] as num?)?.toDouble() ?? 0.0 : 0.0;
    }
    if (json.containsKey('snow')) {
      final snowData = json['snow'];
      precipitation += snowData is Map ?
        (snowData['1h'] as num?)?.toDouble() ?? 0.0 : 0.0;
    }

    // Extract main weather data
    final main = json['main'] ?? {};
    final weather = (json['weather'] as List?)?.isNotEmpty == true
      ? json['weather'][0]
      : {};
    final visibilityData = json['visibility'] as num?;
    final wind = json['wind'] ?? {};

    return WeatherData(
      precipitation: precipitation,
      temperature: (main['temp'] as num?)?.toDouble() ?? 0.0,
      humidity: (main['humidity'] as num?)?.toInt() ?? 0,
      description: (weather['description'] as String?) ?? 'Unknown',
      iconCode: (weather['icon'] as String?) ?? '01d',
      visibility: visibilityData != null ? (visibilityData / 1000).toDouble() : 10.0, // Convert to km
      windSpeed: (wind['speed'] as num?)?.toDouble() ?? 0.0,
      windDirection: (wind['deg'] as num?)?.toDouble() ?? 0.0,
      pressure: (main['pressure'] as num?)?.toDouble() ?? 1013.0,
      uvIndex: (json['uvi'] as num?)?.toDouble() ?? 0.0,
    );
  } catch (e) {
    print('Error parsing weather data: $e');
    return WeatherData(
      precipitation: 0.0,
      temperature: 0.0,
      humidity: 0,
      description: 'Error',
      iconCode: '01d',
      visibility: 10.0,
      windSpeed: 0.0,
      windDirection: 0.0,
      pressure: 1013.0,
      uvIndex: 0.0,
    );
  }
}