如何使用带有“mailto:”链接的新 launchUrl() 方法?

Kar*_*ård 3 mailto email-client dart flutter url-launcher

我的应用程序中有一个小链接,上面写着“向我们发送电子邮件”。当您单击它时,我希望打开默认电子邮件应用程序,并向我们的电子邮件地址发送一封电子邮件。launch()我曾经用包中的方法让它完全做到这一点,url_launcher如下所示:

import 'package:url_launcher/url_launcher.dart' as url;

Future<bool?> pressedSendUsEmail() async {
  bool? success;
  try {
    print('Pressed Send us an e-mail...');
    success = await url.launch('mailto:our.email@gmail.com');  // Works like a charm...
    print('success is $success');
  } catch (e) {
    print('Caught an error in Send us an e-mail!');
    print('e is: ${e.toString()}');
  }
  return success;
}
Run Code Online (Sandbox Code Playgroud)

但现在,我收到一条警告,说launch()已弃用!我应该用它launchUrl()来代替。但launchUrl()不接受 String 参数,它接受 Uri 参数...并且我不知道如何正确编写此 Uri,以便它执行我想要的操作!我试过:

  success = await url.launchUrl(Uri(path: 'mailto:our.email@gmail.com'));
Run Code Online (Sandbox Code Playgroud)

但这会引发错误,因为它无法解释“:”字符。我试过了:

  success = await url.launchUrl(
    Uri.https('mailto:our.email@gmail.com', ''),
  );
Run Code Online (Sandbox Code Playgroud)

这会启动链接,但在浏览器中......并且不会启动发送到预先打印的地址的电子邮件。我尝试添加:

  success = await url.launchUrl(
    Uri.https('mailto:our.email@gmail.com', ''),
    mode: url.LaunchMode.externalApplication,
  );
Run Code Online (Sandbox Code Playgroud)

这让我可以选择使用哪个外部应用程序打开链接,但不幸的是,只列出了浏览器应用程序......而不是电子邮件应用程序!

我应该如何编写我的命令才能使launchUrl()刚刚做的事情与旧的完全一样launch()?非常感谢您的帮助!


编辑:

在下面这个问题得到满意的回答之后,我现在有了一个后续问题:

在应用程序的另一部分,有一个地方可以让用户输入链接,我曾经用launch()...启动它,还有一种简单的方法吗?

因为在这种情况下,我不知道链接是 http 还是 https 或者确实是 mailto:!...而且我宁愿不必编写大量代码来找出答案!我只是希望它尝试完全按照编写的方式启动链接,只要编写正确,它就会起作用。

Xuu*_*huc 7

尝试这个:

void _sendEmail(){
   final Uri emailLaunchUri = Uri(
     scheme: 'mailto',
     path: 'our.email@gmail.com',
     queryParameters: {
      'subject': 'CallOut user Profile',
      'body': widget.userModel?.username ?? ''
     },
    );
   launchUrl(emailLaunchUri);
}
Run Code Online (Sandbox Code Playgroud)


Ran*_*rtz 5

当其他答案已经内置时,不需要其他答案的无意义的冗余子例程Uri

void _sendEmail(){
    final Uri emailLaunchUri = Uri(
        scheme: 'mailto',
        path: 'our.email@gmail.com',
        queryParameters: {
            'subject': 'CallOut user Profile',
            'body': widget.userModel?.username ?? ''
        },
    );
    launchUrl(emailLaunchUri);
}
Run Code Online (Sandbox Code Playgroud)