You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter url_launcher如何用launchUrl()打开mailto邮件链接

正确实现mailto链接唤起邮件应用

旧版launch()方法废弃后,不需要手动拆分Uri组件构造,直接用Uri.parse()解析完整的mailto协议字符串传入launchUrl()即可,和旧方法行为完全一致,可直接唤起系统默认邮件应用并自动填充收件人:

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

Future<bool?> pressedSendUsEmail() async {
  bool? success;
  try {
    print('Pressed Send us an e-mail...');
    // 直接解析完整mailto链接为Uri对象即可
    final emailUri = Uri.parse('mailto:our.email@gmail.com');
    success = await url.launchUrl(emailUri);
    print('success is $success');
  } catch (e) {
    print('Caught an error in Send us an e-mail!');
    print('e is: ${e.toString()}');
  }
  return success;
}

如果需要自动填充邮件主题、正文、抄送地址,直接给Uri追加query参数即可,示例:

final emailUri = Uri(
  scheme: 'mailto',
  path: 'our.email@gmail.com',
  queryParameters: {
    'subject': '应用反馈',
    'body': '请在这里描述你遇到的问题:',
    'cc': 'cc@example.com'
  }
);

你之前尝试失败的原因:

  • 传入Uri(path: 'mailto:our.email@gmail.com')报错:path参数仅接受路径内容,不会识别协议头,字符串中的冒号会被判定为非法路径字符抛出异常
  • 用Uri.https()构造:会强制把传入内容识别为https协议链接,自然只能在浏览器中打开,即便指定LaunchMode.externalApplication也只会弹出浏览器类应用选项,无法匹配到邮件应用。

任意用户输入链接的通用打开方案

不需要手动编写代码判断链接协议,直接对用户输入的原始链接字符串调用Uri.parse()即可,系统会自动识别链接的scheme并匹配对应处理应用,和旧版launch()的默认行为一致。
通用实现代码如下:

Future<bool?> openUserInputLink(String rawLink) async {
  bool? success;
  try {
    final uri = Uri.parse(rawLink);
    // 先校验当前设备是否有可处理该链接的应用,避免崩溃
    if (await url.canLaunchUrl(uri)) {
      success = await url.launchUrl(uri);
    } else {
      print('当前设备无可用应用打开该链接');
    }
  } catch (e) {
    print('打开链接出错:${e.toString()}');
  }
  return success;
}

注意如果用户输入的是不带协议头的纯域名(例如直接输入example.com而非https://example.com),Uri.parse会将其识别为普通文本路径而非网页链接,这种场景可以在解析前判断字符串是否包含已知协议头,没有的话默认补https://前缀即可,不需要针对mailto、tel等特殊协议做额外处理——只要用户输入的链接带明确协议头,Uri.parse都能正确识别。


内容的提问来源于stack exchange,提问作者Karolina Hagegård

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:06:23