5
votes

Problème d'envoi d'e-mail avec le lanceur d'URL en flutter

Bonjour, j'essaye de lancer la page e-mail avec le destinataire. J'ai essayé l'expéditeur d'e-mails flutter qui fonctionne avec Android mais pas sur iOS pour moi. J'ai donc essayé le lanceur d'url pour faire la même chose, mais ne fonctionnant pas aussi avec iOS. J'utilise le simulateur iOS, le problème peut-il être ceci?

J'utilise cet exemple de lanceur d'url

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: MissingPluginException(No implementation found for method canLaunch on channel plugins.flutter.io/url_launcher)
#0      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:314:7)
<asynchronous suspension>
#1      canLaunch (package:url_launcher/url_launcher.dart:112:25)
<asynchronous suspension>
#2      _MyAppState._launchEmail (package:testmail/main.dart:20:15)
<asynchronous suspension>
#3      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:654:14)
#4      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:729:32)
#5      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
#6      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:365:11)
#7      TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:275:7)
#8      PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/<…>

J'ai cette erreur

import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {


  String email="contact@ouiquit.com";
  _launchEmail() async {
    if (await canLaunch("mailto:$email")) {
      await launch("mailto:$email");
    } else {
      throw 'Could not launch';
    }
  }

  @override
  Widget build(BuildContext context) {


    return MaterialApp(
      theme: ThemeData(primaryColor: Colors.red),
      home: Scaffold(
        appBar: AppBar(
          title: Text('test mail'),
          actions: <Widget>[
            IconButton(
              onPressed: _launchEmail,
              icon: Icon(Icons.send),
            )
          ],
        ),


      ),
    );
  }


}

Voici l'exemple complet avec le lanceur d'url

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: Could not launch mailto:xxxx@xxxx.com?subject=News&body=New%20plugin
#0      _menuscreenState._launchURL (package:xxxx/bottom.dart:8285:7)
<asynchronous suspension>
#1      _menuscreenState.build.<anonymous closure>.<anonymous closure> (package:xxxx/bottom.dart:8705:13)

Voici l'erreur

mailto:xxxxx@xxxxx.com?subject=News&body=New%20plugin


0 commentaires

7 Réponses :


0
votes

Veuillez essayer ceci, je l'ai utilisé et cela fonctionne très bien pour moi.

 _launchEmail() async {
      if (await canLaunch("mailto:$email")) {
        await launch("mailto:$email");
      } else {
        throw 'Could not launch';
      }
    }


4 commentaires

J'ai mis à jour le message avec un exemple complet avec votre code et cela ne fonctionne pas


J'ai la réponse, il n'y a pas de possibilité d'appeler l'application de messagerie sur l'émulateur iOS


qu'en est-il de l'émulateur Android? Je reçois un crash sur Android au démarrage de l'application, à l'émulateur et à l'appareil.


Veuillez ouvrir le problème de bogue dans url_launcher gitHub. Mais cela fonctionne avec les téléphones.



0
votes

Pour iOS, j'ai ajouté comme ça

**

_launchEmail() async {
    // ios specification
    final String subject = "Subject:";
    final String stringText = "Same Message:";
    String uri = 'mailto:administrator@gmail.com?subject=${Uri.encodeComponent(subject)}&body=${Uri.encodeComponent(stringText)}';
    if (await canLaunch(uri)) {
      await launch(uri);
    } else {
      print("No email client found");
    }
  }

**


0 commentaires

1
votes

C'est la fonction que j'utilise pour envoyer du courrier en utilisant url_launcher:

void _launchURL() async {
    final Uri params = Uri(
      scheme: 'mailto',
      path: 'my.mail@example.com',
    );
    String  url = params.toString();
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      print( 'Could not launch $url');
    }
  }


0 commentaires

0
votes

essayez le plugin mailto

https://pub.dev/packages/mailto#-readme-tab-

cela fonctionne à la fois sous Android et iOS sur l'appareil, cela fonctionne très bien.

void funcOpenMailComposer() async{

    final mailtoLink = Mailto(
      to: ['test@gmail.com'],
      cc: ['test12@gmail.com','test13@gmail.com'],
      subject: '',
      body: '',
    );
  await launch('$mailtoLink');
}


0 commentaires

6
votes

Cela fonctionne pour moi sur les appareils Android et iOS:

Ajoutez un paramètre de query si vous avez également un subject et un body .

final Uri params = Uri(
  scheme: 'mailto',
  path: 'email@example.com',
  query: 'subject=App Feedback&body=App Version 3.23', //add subject and body here
);

var url = params.toString();
if (await canLaunch(url)) {
  await launch(url);
} else {
  throw 'Could not launch $url';
}


0 commentaires

0
votes

J'ai eu la même erreur, mais après le redémarrage de l'application, elle avait disparu.


0 commentaires

0
votes

Pour tous les gens qui se demandent encore pourquoi cela ne fonctionne pas comme moi. N'oubliez pas que le simulateur ne peut pas gérer mailto car l'application de messagerie n'est pas disponible. Si vous utilisez canLaunch avant d'appeler launch, vous obtiendrez plus d'informations.


0 commentaires