Aprire link, email e telefono in Flutter con url_launcher
GuidePrincipiante25 min Flutter 3.x

Aprire link, email e telefono in Flutter con 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.

In 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.

  1. 1

    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.

    Dopo l'aggiunta, esegui flutter pub get per scaricare il pacchetto.

    flutter pub add url_launcher

    Risultato atteso

    La dipendenza url_launcher compare in pubspec.yaml e viene scaricata senza errori.

  2. 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.

    Android: apri android/app/src/main/AndroidManifest.xml e aggiungi un blocco <queries> dentro il tag <manifest> (fuori da <application>).

    iOS: apri ios/Runner/Info.plist e aggiungi le chiavi LSApplicationQueriesSchemes.

    <!-- AndroidManifest.xml -->
    <manifest ...>
      <queries>
        <intent>
          <action android:name="android.intent.action.VIEW" />
          <data android:scheme="https" />
        </intent>
        <intent>
          <action android:name="android.intent.action.DIAL" />
          <data android:scheme="tel" />
        </intent>
        <intent>
          <action android:name="android.intent.action.SENDTO" />
          <data android:scheme="mailto" />
        </intent>
      </queries>
    </manifest>
    
    <!-- Info.plist (iOS) -->
    <key>LSApplicationQueriesSchemes</key>
    <array>
      <string>https</string>
      <string>tel</string>
      <string>mailto</string>
      <string>sms</string>
    </array>

    Risultato atteso

    Le configurazioni permettono all'app di verificare e aprire gli schemi https, tel, mailto e sms.

  3. 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.

    Importa il pacchetto con import 'package:url_launcher/url_launcher.dart';.

    import 'package:url_launcher/url_launcher.dart';
    
    Future<bool> apriUri(Uri uri) async {
      if (await canLaunchUrl(uri)) {
        return await launchUrl(
          uri,
          mode: LaunchMode.externalApplication,
        );
      }
      return false;
    }

    Risultato atteso

    Una funzione riutilizzabile che apre qualsiasi Uri e ritorna false se non è possibile.

  4. 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.

    Costruiamo l'Uri con Uri.parse e lo passiamo al nostro helper.

    ElevatedButton(
      onPressed: () async {
        final url = Uri.parse('https://flutter.dev');
        final ok = await apriUri(url);
        if (!ok && context.mounted) {
          ScaffoldMessenger.of(context).showSnackBar(
            const SnackBar(content: Text('Impossibile aprire il link')),
          );
        }
      },
      child: const Text('Apri flutter.dev'),
    )

    Risultato atteso

    Al tocco del pulsante si apre il browser sulla pagina di Flutter.

  5. 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.

    Nota: la telefonata effettiva parte solo su dispositivi con capacità telefoniche; sull'emulatore potrebbe aprire solo il dialer.

    // Telefonata
    final tel = Uri(scheme: 'tel', path: '+390123456789');
    await apriUri(tel);
    
    // SMS con testo precompilato
    final sms = Uri(
      scheme: 'sms',
      path: '+390123456789',
      queryParameters: {'body': 'Ciao dal mio app Flutter!'},
    );
    await apriUri(sms);

    Risultato atteso

    Si apre il dialer con il numero inserito, oppure l'app SMS con destinatario e testo precompilati.

  6. 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.

    Creiamo una funzione dedicata che costruisce correttamente l'Uri con la codifica dei caratteri speciali.

    Future<void> inviaEmail() async {
      final email = Uri(
        scheme: 'mailto',
        path: 'supporto@esempio.it',
        queryParameters: {
          'subject': 'Richiesta informazioni',
          'body': 'Salve,\nvorrei maggiori dettagli su...',
        },
      );
      await apriUri(email);
    }

    Risultato atteso

    Si apre l'app email con destinatario, oggetto e corpo del messaggio già inseriti.

  7. 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.

    Ricorda inoltre di controllare context.mounted prima di usare il BuildContext dopo un await, per evitare eccezioni se il widget è stato smontato.

    Future<void> gestisciAzione(BuildContext context, Uri uri) async {
      final ok = await apriUri(uri);
      if (!context.mounted) return;
      if (!ok) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Azione non disponibile: ${uri.scheme}')),
        );
      }
    }

    Risultato atteso

    L'app gestisce con eleganza i casi in cui un'azione non è disponibile, senza crash e con un messaggio chiaro.

CondividiXLinkedInFacebookWhatsApp

Commenti (0)

Ancora nessun commento. Inizia tu!