在颤振中使用 URL 启动器发送电子邮件的问题

Nit*_*euq 9 flutter

您好,我尝试使用 Recipent 启动电子邮件页面。我尝试了使用 android 但不适用于我的 ios 的 flutter 电子邮件发件人。所以我尝试使用 url 启动器来做同样的事情,但不适用于 iOS。我使用iOS模拟器,问题可能是这个?

我使用这个 url 启动器的例子

mailto:xxxxx@xxxxx.com?subject=News&body=New%20plugin
Run Code Online (Sandbox Code Playgroud)

我有这个错误

[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)
Run Code Online (Sandbox Code Playgroud)

这是带有 url 启动器的完整示例

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),
            )
          ],
        ),


      ),
    );
  }


}
Run Code Online (Sandbox Code Playgroud)

这是错误

[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/<…>
Run Code Online (Sandbox Code Playgroud)

Stu*_*PhD 28

上面给出的解决方案适用API < 30,但API >= 30需要将以下解决方案添加到您的AndroidManifest.xml文件中才能发送电子邮件。

<queries>
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="https" />
    </intent>
    <intent>
        <action android:name="android.intent.action.SEND" />
        <data android:mimeType="*/*" />
    </intent>
</queries>
Run Code Online (Sandbox Code Playgroud)

来源

  • 我很高兴你不再陷入博士学位,所以你可以分享这样一个非常有用的答案。谢谢你! (7认同)
  • 哈哈..谢谢&lt;3 (3认同)

Rav*_*mar 16

这在 Android 和 iOS 设备上都适用于我:

query如果您也有subject,请添加参数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';
}
Run Code Online (Sandbox Code Playgroud)


小智 10

适用于 iOS

iOS 模拟器上没有安装电子邮件应用程序,您只能在真实设备上进行测试。


Kum*_*hod 1

请尝试一下,我已经使用过它并且对我来说效果很好。

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