[{"data":1,"prerenderedAt":77},["ShallowReactive",2],{"tutorial-aprire-link-email-e-telefono-in-flutter-con-url-launcher":3,"comments-tutorial-aprire-link-email-e-telefono-in-flutter-con-url-launcher":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},29,"Aprire link, email e telefono in Flutter con url_launcher","aprire-link-email-e-telefono-in-flutter-con-url-launcher","Impara a integrare azioni esterne nella tua app Flutter: apri pagine web nel browser, avvia email precompilate, telefonate e messaggi SMS con il pacchetto url_launcher.","Molte app hanno bisogno di interagire con il mondo esterno: aprire una pagina web, avviare una chiamata telefonica, comporre un'email o mandare un SMS. Il pacchetto ufficiale **url_launcher** rende tutto questo semplice e cross-platform.\n\nIn questo tutorial vedremo come installare e configurare correttamente `url_launcher` su Android e iOS, e come gestire i vari schemi URL (`https`, `mailto`, `tel`, `sms`) in modo robusto, verificando la disponibilità prima di lanciare l'azione.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Ftutorials\u002Fdb5ed8b7-5cc7-4775-8d6b-a6c099bce665.jpg",null,"beginner",25,"3.x","published","2026-07-05T04:30:42+00:00","url_launcher in Flutter: link, email e telefono","Guida pratica a url_launcher in Flutter: apri URL nel browser, email, telefonate e SMS con configurazione Android e iOS.",{"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},195,"Installare il pacchetto url_launcher","Aggiungi la dipendenza `url_launcher` al progetto. Puoi usare il comando da terminale oppure inserirla manualmente nel file `pubspec.yaml`.\n\nDopo l'aggiunta, esegui `flutter pub get` per scaricare il pacchetto.","flutter pub add url_launcher","bash","La dipendenza url_launcher compare in pubspec.yaml e viene scaricata senza errori.",{"id":33,"position":34,"title":35,"body":36,"code_snippet":37,"code_language":38,"expected_result":39,"demo_url":10,"video_url":10},196,2,"Configurare i permessi su Android e iOS","A partire dalle versioni recenti, Android e iOS richiedono di dichiarare esplicitamente gli schemi URL che l'app intende aprire.\n\n**Android**: apri `android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml` e aggiungi un blocco `\u003Cqueries>` dentro il tag `\u003Cmanifest>` (fuori da `\u003Capplication>`).\n\n**iOS**: apri `ios\u002FRunner\u002FInfo.plist` e aggiungi le chiavi `LSApplicationQueriesSchemes`.","\u003C!-- AndroidManifest.xml -->\n\u003Cmanifest ...>\n  \u003Cqueries>\n    \u003Cintent>\n      \u003Caction android:name=\"android.intent.action.VIEW\" \u002F>\n      \u003Cdata android:scheme=\"https\" \u002F>\n    \u003C\u002Fintent>\n    \u003Cintent>\n      \u003Caction android:name=\"android.intent.action.DIAL\" \u002F>\n      \u003Cdata android:scheme=\"tel\" \u002F>\n    \u003C\u002Fintent>\n    \u003Cintent>\n      \u003Caction android:name=\"android.intent.action.SENDTO\" \u002F>\n      \u003Cdata android:scheme=\"mailto\" \u002F>\n    \u003C\u002Fintent>\n  \u003C\u002Fqueries>\n\u003C\u002Fmanifest>\n\n\u003C!-- Info.plist (iOS) -->\n\u003Ckey>LSApplicationQueriesSchemes\u003C\u002Fkey>\n\u003Carray>\n  \u003Cstring>https\u003C\u002Fstring>\n  \u003Cstring>tel\u003C\u002Fstring>\n  \u003Cstring>mailto\u003C\u002Fstring>\n  \u003Cstring>sms\u003C\u002Fstring>\n\u003C\u002Farray>","xml","Le configurazioni permettono all'app di verificare e aprire gli schemi https, tel, mailto e sms.",{"id":41,"position":42,"title":43,"body":44,"code_snippet":45,"code_language":46,"expected_result":47,"demo_url":10,"video_url":10},197,3,"Creare una funzione helper per aprire un URL","Per evitare di ripetere codice, creiamo una funzione helper che riceve un `Uri`, verifica che possa essere aperto con `canLaunchUrl` e lo lancia con `launchUrl`. Restituiamo un `bool` per gestire eventuali errori nell'interfaccia.\n\nImporta il pacchetto con `import 'package:url_launcher\u002Furl_launcher.dart';`.","import 'package:url_launcher\u002Furl_launcher.dart';\n\nFuture\u003Cbool> apriUri(Uri uri) async {\n  if (await canLaunchUrl(uri)) {\n    return await launchUrl(\n      uri,\n      mode: LaunchMode.externalApplication,\n    );\n  }\n  return false;\n}","dart","Una funzione riutilizzabile che apre qualsiasi Uri e ritorna false se non è possibile.",{"id":49,"position":50,"title":51,"body":52,"code_snippet":53,"code_language":46,"expected_result":54,"demo_url":10,"video_url":10},198,4,"Aprire una pagina web nel browser","Usa lo schema `https` per aprire una pagina web. Con `LaunchMode.externalApplication` il link viene aperto nel browser di sistema; puoi anche usare `LaunchMode.inAppWebView` per aprirlo dentro l'app.\n\nCostruiamo l'Uri con `Uri.parse` e lo passiamo al nostro helper.","ElevatedButton(\n  onPressed: () async {\n    final url = Uri.parse('https:\u002F\u002Fflutter.dev');\n    final ok = await apriUri(url);\n    if (!ok && context.mounted) {\n      ScaffoldMessenger.of(context).showSnackBar(\n        const SnackBar(content: Text('Impossibile aprire il link')),\n      );\n    }\n  },\n  child: const Text('Apri flutter.dev'),\n)","Al tocco del pulsante si apre il browser sulla pagina di Flutter.",{"id":56,"position":57,"title":58,"body":59,"code_snippet":60,"code_language":46,"expected_result":61,"demo_url":10,"video_url":10},199,5,"Avviare una telefonata e un SMS","Per le telefonate si usa lo schema `tel:` seguito dal numero, mentre per gli SMS lo schema `sms:`. Puoi anche precompilare il corpo del messaggio tramite i query parameters.\n\nNota: la telefonata effettiva parte solo su dispositivi con capacità telefoniche; sull'emulatore potrebbe aprire solo il dialer.","\u002F\u002F Telefonata\nfinal tel = Uri(scheme: 'tel', path: '+390123456789');\nawait apriUri(tel);\n\n\u002F\u002F SMS con testo precompilato\nfinal sms = Uri(\n  scheme: 'sms',\n  path: '+390123456789',\n  queryParameters: {'body': 'Ciao dal mio app Flutter!'},\n);\nawait apriUri(sms);","Si apre il dialer con il numero inserito, oppure l'app SMS con destinatario e testo precompilati.",{"id":63,"position":64,"title":65,"body":66,"code_snippet":67,"code_language":46,"expected_result":68,"demo_url":10,"video_url":10},200,6,"Comporre un'email precompilata","Con lo schema `mailto:` puoi aprire il client email di default con destinatario, oggetto e corpo già compilati. I parametri vanno passati come query parameters codificati.\n\nCreiamo una funzione dedicata che costruisce correttamente l'Uri con la codifica dei caratteri speciali.","Future\u003Cvoid> inviaEmail() async {\n  final email = Uri(\n    scheme: 'mailto',\n    path: 'supporto@esempio.it',\n    queryParameters: {\n      'subject': 'Richiesta informazioni',\n      'body': 'Salve,\\nvorrei maggiori dettagli su...',\n    },\n  );\n  await apriUri(email);\n}","Si apre l'app email con destinatario, oggetto e corpo del messaggio già inseriti.",{"id":70,"position":71,"title":72,"body":73,"code_snippet":74,"code_language":46,"expected_result":75,"demo_url":10,"video_url":10},201,7,"Gestire gli errori e testare su dispositivo reale","Alcuni schemi (come `tel` o `sms`) funzionano solo su dispositivi fisici. È buona pratica mostrare sempre un feedback all'utente quando `canLaunchUrl` restituisce `false`.\n\nRicorda inoltre di controllare `context.mounted` prima di usare il `BuildContext` dopo un `await`, per evitare eccezioni se il widget è stato smontato.","Future\u003Cvoid> gestisciAzione(BuildContext context, Uri uri) async {\n  final ok = await apriUri(uri);\n  if (!context.mounted) return;\n  if (!ok) {\n    ScaffoldMessenger.of(context).showSnackBar(\n      SnackBar(content: Text('Azione non disponibile: ${uri.scheme}')),\n    );\n  }\n}","L'app gestisce con eleganza i casi in cui un'azione non è disponibile, senza crash e con un messaggio chiaro.",[],1785219609725]