WeatherData.fromJson constructor

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

Implementation

factory WeatherData.fromJson(Map<String, dynamic> json) {
  final current = json['current'] as Map<String, dynamic>;

  // Get today's min/max temperature from daily data if available.

  double? maxTemp;
  double? minTemp;
  if (json.containsKey('daily')) {
    final daily = json['daily'] as Map<String, dynamic>;
    if (daily.containsKey('temperature_2m_max')) {
      final maxList = daily['temperature_2m_max'] as List;
      if (maxList.isNotEmpty) maxTemp = (maxList[0] as num).toDouble();
    }
    if (daily.containsKey('temperature_2m_min')) {
      final minList = daily['temperature_2m_min'] as List;
      if (minList.isNotEmpty) minTemp = (minList[0] as num).toDouble();
    }
  }

  // Calculate today's total precipitation from hourly data.

  double? todayTotal;
  if (json.containsKey('hourly')) {
    final hourly = json['hourly'] as Map<String, dynamic>;
    if (hourly.containsKey('precipitation') && hourly.containsKey('time')) {
      final times = (hourly['time'] as List).cast<String>();
      final precips = (hourly['precipitation'] as List).cast<num>();
      final now = DateTime.parse(current['time'] as String);

      double sum = 0.0;
      for (var i = 0; i < times.length; i++) {
        final time = DateTime.parse(times[i]);

        // Only sum precipitation for hours up to current time today.

        if (time.year == now.year &&
            time.month == now.month &&
            time.day == now.day &&
            time.isBefore(now.add(const Duration(hours: 1)))) {
          sum += precips[i].toDouble();
        }
      }
      todayTotal = sum;
    }
  }

  return WeatherData(
    temperature: (current['temperature_2m'] as num).toDouble(),
    weatherCode: current['weather_code'] as int,
    windSpeed: (current['wind_speed_10m'] as num).toDouble(),
    windDirection: (current['wind_direction_10m'] as num).toInt(),
    humidity: (current['relative_humidity_2m'] as num).toInt(),
    precipitation: (current['precipitation'] as num).toDouble(),
    time: DateTime.parse(current['time'] as String),
    dailyMaxTemp: maxTemp,
    dailyMinTemp: minTemp,
    todayTotalPrecipitation: todayTotal,
  );
}