import 'dart:convert'; import 'dart:io'; /// Keyless current-temperature lookup for the dashboard fallback. /// /// Open-Meteo is used deliberately: no API key, no account and a tiny JSON /// response. Any failure returns null so the UI simply hides the row. class WeatherService { Future temperatureCelsius({ required double latitude, required double longitude, }) async { final uri = Uri.https('api.open-meteo.com', '/v1/forecast', { 'latitude': latitude.toStringAsFixed(4), 'longitude': longitude.toStringAsFixed(4), 'current': 'temperature_2m', 'timezone': 'auto', }); final client = HttpClient()..connectionTimeout = const Duration(seconds: 8); try { final request = await client.getUrl(uri); request.headers.set(HttpHeaders.userAgentHeader, 'CarDash/0.6'); final response = await request.close().timeout( const Duration(seconds: 10), ); if (response.statusCode != HttpStatus.ok) return null; final body = await response.transform(utf8.decoder).join(); final decoded = jsonDecode(body); if (decoded is! Map) return null; final current = decoded['current']; if (current is! Map) return null; final temperature = current['temperature_2m']; if (temperature is! num) return null; if (temperature < -90 || temperature > 60) return null; return temperature.toDouble(); } catch (_) { return null; } finally { client.close(force: true); } } }