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
相关产品推荐
相关产品推荐

