[{"data":1,"prerenderedAt":77},["ShallowReactive",2],{"tutorial-localizzare-lutente-in-flutter-con-il-pacchetto-geolocator":3,"comments-tutorial-localizzare-lutente-in-flutter-con-il-pacchetto-geolocator":76},{"id":4,"title":5,"slug":6,"excerpt":7,"intro":8,"cover_image":9,"video_url":10,"difficulty":11,"estimated_minutes":12,"flutter_version":13,"status":14,"published_at":15,"meta_title":16,"meta_description":17,"category":18,"author":22,"steps":24},42,"Localizzare l'utente in Flutter con il pacchetto geolocator","localizzare-lutente-in-flutter-con-il-pacchetto-geolocator","Impara a ottenere la posizione GPS dell'utente in Flutter con geolocator: gestione dei permessi, coordinate in tempo reale e calcolo delle distanze.","Molte app moderne hanno bisogno di conoscere la posizione dell'utente: dai servizi di consegna alle app di fitness, dalla ricerca di negozi vicini alle mappe. In questo tutorial impareremo a usare il pacchetto **geolocator**, la soluzione più diffusa e completa per gestire la geolocalizzazione in Flutter.\n\nVedremo come richiedere i permessi in modo corretto, ottenere la posizione attuale, ascoltare gli aggiornamenti in tempo reale e calcolare la distanza tra due punti. Il tutto seguendo le best practice per gestire i casi in cui i servizi di localizzazione sono disattivati o i permessi vengono negati.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Ftutorials\u002F91489ab8-e5e3-43be-bd7a-d96d6d5552c3.jpg",null,"intermediate",35,"3.x","published","2026-07-19T04:30:48+00:00","Geolocalizzazione in Flutter con geolocator","Guida pratica a geolocator in Flutter: permessi, posizione GPS in tempo reale e calcolo distanze, con esempi di codice completi.",{"id":19,"name":20,"slug":21},1,"Guide","guide",{"id":19,"name":23},"Flutter Bot",[25,32,40,48,55,62,69],{"id":26,"position":19,"title":27,"body":28,"code_snippet":29,"code_language":30,"expected_result":31,"demo_url":10,"video_url":10},282,"Aggiungere la dipendenza e configurare i permessi","Iniziamo aggiungendo il pacchetto `geolocator` al progetto. Puoi farlo da terminale con il comando:\n\n```bash\nflutter pub add geolocator\n```\n\nOppure aggiungendo manualmente la dipendenza nel `pubspec.yaml`. Dopo aver salvato, esegui `flutter pub get`.\n\nÈ fondamentale dichiarare i permessi nelle configurazioni native di ciascuna piattaforma, altrimenti l'app crasherà al momento della richiesta.","# pubspec.yaml\ndependencies:\n  flutter:\n    sdk: flutter\n  geolocator: ^12.0.0","yaml","Il pacchetto geolocator è installato e disponibile nel progetto.",{"id":33,"position":34,"title":35,"body":36,"code_snippet":37,"code_language":38,"expected_result":39,"demo_url":10,"video_url":10},283,2,"Configurare Android e iOS","Su **Android** aggiungi i permessi nel file `android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml`, all'interno del tag `\u003Cmanifest>`.\n\nSu **iOS** devi aggiungere le chiavi di descrizione nel file `ios\u002FRunner\u002FInfo.plist`: iOS richiede che tu spieghi all'utente perché l'app vuole accedere alla posizione, altrimenti la richiesta verrà rifiutata a livello di sistema.","\u003C!-- AndroidManifest.xml -->\n\u003Cuses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" \u002F>\n\n\u003C!-- Info.plist (iOS) -->\n\u003Ckey>NSLocationWhenInUseUsageDescription\u003C\u002Fkey>\n\u003Cstring>L'app usa la posizione per mostrarti i luoghi vicini.\u003C\u002Fstring>","xml","Le piattaforme sono configurate per richiedere l'accesso alla posizione.",{"id":41,"position":42,"title":43,"body":44,"code_snippet":45,"code_language":46,"expected_result":47,"demo_url":10,"video_url":10},284,3,"Verificare servizi e richiedere i permessi","Prima di ottenere la posizione bisogna sempre controllare due cose: che i **servizi di localizzazione del dispositivo** siano attivi e che l'utente abbia concesso i **permessi** all'app.\n\nCreiamo una funzione riutilizzabile che gestisce tutti i casi possibili: servizi disattivati, permesso negato una volta e permesso negato permanentemente. Restituisce `true` solo quando è tutto a posto.","import 'package:geolocator\u002Fgeolocator.dart';\n\nFuture\u003Cbool> gestisciPermessi() async {\n  \u002F\u002F 1. Controlla se i servizi di localizzazione sono attivi\n  bool serviziAttivi = await Geolocator.isLocationServiceEnabled();\n  if (!serviziAttivi) {\n    \u002F\u002F I servizi GPS sono disattivati dal dispositivo\n    return false;\n  }\n\n  \u002F\u002F 2. Controlla lo stato dei permessi\n  LocationPermission permesso = await Geolocator.checkPermission();\n  if (permesso == LocationPermission.denied) {\n    permesso = await Geolocator.requestPermission();\n    if (permesso == LocationPermission.denied) {\n      return false;\n    }\n  }\n\n  if (permesso == LocationPermission.deniedForever) {\n    \u002F\u002F L'utente ha negato per sempre: va aperto le impostazioni\n    return false;\n  }\n\n  \u002F\u002F Permesso concesso (whileInUse o always)\n  return true;\n}","dart","Una funzione che gestisce in modo sicuro tutti gli scenari di permesso.",{"id":49,"position":50,"title":51,"body":52,"code_snippet":53,"code_language":46,"expected_result":54,"demo_url":10,"video_url":10},285,4,"Ottenere la posizione attuale","Una volta ottenuti i permessi possiamo recuperare la posizione corrente con `Geolocator.getCurrentPosition()`. Il parametro `LocationSettings` permette di specificare la precisione desiderata: valori più alti consumano più batteria ma sono più accurati.\n\nL'oggetto `Position` restituito contiene latitudine, longitudine, altitudine, velocità e altri dati utili.","Future\u003CPosition?> ottieniPosizione() async {\n  final ok = await gestisciPermessi();\n  if (!ok) return null;\n\n  const settings = LocationSettings(\n    accuracy: LocationAccuracy.high,\n    distanceFilter: 0,\n  );\n\n  final posizione = await Geolocator.getCurrentPosition(\n    locationSettings: settings,\n  );\n\n  print('Lat: ${posizione.latitude}, Lng: ${posizione.longitude}');\n  return posizione;\n}","In console vengono stampate le coordinate GPS attuali del dispositivo.",{"id":56,"position":57,"title":58,"body":59,"code_snippet":60,"code_language":46,"expected_result":61,"demo_url":10,"video_url":10},286,5,"Mostrare la posizione in un widget","Integriamo la logica in un widget con stato. Alla pressione di un pulsante recuperiamo la posizione e la mostriamo a schermo, gestendo anche lo stato di caricamento e gli eventuali errori (ad esempio permessi negati).","class PosizioneScreen extends StatefulWidget {\n  const PosizioneScreen({super.key});\n\n  @override\n  State\u003CPosizioneScreen> createState() => _PosizioneScreenState();\n}\n\nclass _PosizioneScreenState extends State\u003CPosizioneScreen> {\n  String _testo = 'Nessuna posizione';\n  bool _caricamento = false;\n\n  Future\u003Cvoid> _aggiorna() async {\n    setState(() => _caricamento = true);\n    final pos = await ottieniPosizione();\n    setState(() {\n      _caricamento = false;\n      _testo = pos == null\n          ? 'Permesso negato o servizi disattivati'\n          : 'Lat: ${pos.latitude}\\nLng: ${pos.longitude}';\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: const Text('La mia posizione')),\n      body: Center(\n        child: Column(\n          mainAxisAlignment: MainAxisAlignment.center,\n          children: [\n            Text(_testo, textAlign: TextAlign.center),\n            const SizedBox(height: 20),\n            _caricamento\n                ? const CircularProgressIndicator()\n                : ElevatedButton(\n                    onPressed: _aggiorna,\n                    child: const Text('Rileva posizione'),\n                  ),\n          ],\n        ),\n      ),\n    );\n  }\n}","Toccando il pulsante l'app mostra le coordinate correnti a schermo.",{"id":63,"position":64,"title":65,"body":66,"code_snippet":67,"code_language":46,"expected_result":68,"demo_url":10,"video_url":10},287,6,"Ascoltare gli aggiornamenti in tempo reale","Per app che seguono lo spostamento dell'utente (fitness, navigazione) possiamo usare lo stream `Geolocator.getPositionStream()`. Il parametro `distanceFilter` indica di quanti metri l'utente deve muoversi prima di ricevere un nuovo evento, utile per risparmiare batteria.\n\nRicordati sempre di cancellare la sottoscrizione nel `dispose()` per evitare memory leak.","import 'dart:async';\n\nStreamSubscription\u003CPosition>? _sub;\n\nvoid avviaTracking() {\n  const settings = LocationSettings(\n    accuracy: LocationAccuracy.high,\n    distanceFilter: 10, \u002F\u002F aggiorna ogni 10 metri\n  );\n\n  _sub = Geolocator.getPositionStream(locationSettings: settings)\n      .listen((Position posizione) {\n    print('Nuova posizione: ${posizione.latitude}, ${posizione.longitude}');\n  });\n}\n\n@override\nvoid dispose() {\n  _sub?.cancel();\n  super.dispose();\n}","L'app riceve aggiornamenti automatici della posizione mentre l'utente si muove.",{"id":70,"position":71,"title":72,"body":73,"code_snippet":74,"code_language":46,"expected_result":75,"demo_url":10,"video_url":10},288,7,"Calcolare la distanza tra due punti","Il pacchetto offre anche `Geolocator.distanceBetween()`, che calcola la distanza in metri tra due coppie di coordinate usando la formula di Haversine. È perfetto per mostrare, ad esempio, quanto dista un negozio dall'utente.\n\nEsiste anche `bearingBetween()` per ottenere la direzione (angolo) tra due punti.","\u002F\u002F Distanza tra il Colosseo e il Duomo di Milano\ndouble metri = Geolocator.distanceBetween(\n  41.8902, 12.4922, \u002F\u002F Colosseo (Roma)\n  45.4642, 9.1900,  \u002F\u002F Duomo (Milano)\n);\n\nfinal km = (metri \u002F 1000).toStringAsFixed(1);\nprint('Distanza: $km km'); \u002F\u002F circa 480.9 km","Viene stampata la distanza in chilometri tra i due punti geografici.",[],1785219607862]