| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- 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<double?> 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);
- }
- }
- }
|