我们采用了各种方法的一点点。它考虑以下事项:
- 它将在Web上工作(
canLaunch
在Web上不起作用,因此请使用try/catch替换)。源。
- 如果没有邮件客户端可用,它会回退到使用剪贴板
- 它使用帮助函数正确编码主题和正文(否则您将得到
+
而不是空格
)
用法
await EmailUtils.launchEmailSubmission(
toEmail: 'info@catfacts.co',
subject: 'I love this app',
body: 'Your feedback below: \n');
email_utils.dart
import 'package:flutter/services.dart';
import 'package:url_launcher/url_launcher.dart';
class EmailUtils {
void launchEmailSubmission({
required String toEmail,
required String subject,
required String body,
}) async {
String mailUrl = _getEmailString(toEmail: toEmail, subject: subject, body: body)
try {
await launch(mailUrl);
} catch (e) {
await Clipboard.setData(ClipboardData(text: '$subject \n $body'));
}
}
static String _getEmailString({
required String toEmail,
required String subject,
required String body,
}) {
final Uri emailReportUri = Uri(
scheme: 'mailto',
path: toEmail,
query: _encodeQueryParameters(<String, String>{
'subject': subject,
'body': body,
}),
);
return emailReportUri.toString();
}
static String? _encodeQueryParameters(Map<String, String> params) {
return params.entries
.map((e) =>
'${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value)}')
.join('&');
}
}