From 1e90f5fc4b8570db0ed718ba0d0446892852b55e Mon Sep 17 00:00:00 2001 From: Sicherhaven Date: Sat, 21 Mar 2026 13:30:05 +0530 Subject: [PATCH] fix: reverse geocode stored coordinates to place names When lat,lng coordinates are stored in SharedPreferences from a previous session, reverse geocode them to a human-readable location name (e.g. "Whitefield, Bengaluru") instead of showing raw numbers like "10.57376,76.01188". Co-Authored-By: Claude Opus 4.6 --- lib/screens/home_screen.dart | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index 9d7af98..bde1f22 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -15,6 +15,7 @@ import 'contribute_screen.dart'; import 'learn_more_screen.dart'; import 'search_screen.dart'; import '../core/app_decoration.dart'; +import 'package:geocoding/geocoding.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:provider/provider.dart'; import '../features/gamification/providers/gamification_provider.dart'; @@ -83,9 +84,16 @@ class _HomeScreenState extends State with SingleTickerProviderStateM _username = prefs.getString('display_name') ?? prefs.getString('username') ?? ''; final storedLocation = prefs.getString('location') ?? 'Whitefield, Bengaluru'; // Fix legacy lat,lng strings saved before the reverse-geocoding fix - if (RegExp(r'^-?\d+\.\d+,-?\d+\.\d+$').hasMatch(storedLocation)) { + final coordMatch = RegExp(r'^(-?\d+\.?\d*),\s*(-?\d+\.?\d*)$').firstMatch(storedLocation); + if (coordMatch != null) { _location = 'Current Location'; - prefs.setString('location', _location); + setState(() {}); + // Reverse geocode in background to get actual place name + _reverseGeocodeAndSave( + double.parse(coordMatch.group(1)!), + double.parse(coordMatch.group(2)!), + prefs, + ); } else { _location = storedLocation; } @@ -116,6 +124,24 @@ class _HomeScreenState extends State with SingleTickerProviderStateM } } + Future _reverseGeocodeAndSave(double lat, double lng, SharedPreferences prefs) async { + try { + final placemarks = await placemarkFromCoordinates(lat, lng); + if (placemarks.isNotEmpty) { + final p = placemarks.first; + final parts = []; + if ((p.subLocality ?? '').isNotEmpty) parts.add(p.subLocality!); + if ((p.locality ?? '').isNotEmpty) parts.add(p.locality!); + if ((p.subAdministrativeArea ?? '').isNotEmpty) parts.add(p.subAdministrativeArea!); + final label = parts.isNotEmpty ? parts.join(', ') : 'Current Location'; + await prefs.setString('location', label); + if (mounted) setState(() => _location = label); + return; + } + } catch (_) {} + await prefs.setString('location', 'Current Location'); + } + Future> _events_service_getEventTypesSafe() async { try { return await _eventsService.getEventTypes();