【问题标题】:Problem to send email with URL launcher in flutter在颤振中使用 URL 启动器发送电子邮件的问题
【发布时间】:2020-01-19 05:44:49
【问题描述】:

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

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

mailto:xxxxx@xxxxx.com?subject=News&body=New%20plugin

我有这个错误

[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)

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


      ),
    );
  }


}

这是错误

[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/<…>

【问题讨论】:

    标签: flutter


    【解决方案1】:

    这对我在 Android 和 iOS 设备上都有效:

    如果您也有subjectbody,请添加query 参数。

    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';
    }
    

    【讨论】:

    • 工作感谢!
    【解决方案2】:

    上面给出的解决方案适用于API &lt; 30,但对于API &gt;= 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>
    

    source

    【讨论】:

      【解决方案3】:

      这是我使用 url_launcher 发送邮件的函数:

      void _launchURL() async {
          final Uri params = Uri(
            scheme: 'mailto',
            path: 'my.mail@example.com',
          );
          String  url = params.toString();
          if (await canLaunch(url)) {
            await launch(url);
          } else {
            print( 'Could not launch $url');
          }
        }
      

      【讨论】:

        【解决方案4】:

        试试mailto插件

        https://pub.dev/packages/mailto#-readme-tab-

        它适用于设备上的 android 和 ios,效果很好..

        void funcOpenMailComposer() async{
        
            final mailtoLink = Mailto(
              to: ['test@gmail.com'],
              cc: ['test12@gmail.com','test13@gmail.com'],
              subject: '',
              body: '',
            );
          await launch('$mailtoLink');
        }
        

        【讨论】:

          【解决方案5】:

          对于所有仍然想知道为什么它不像我那样工作的人。请记住,模拟器无法处理 mailto,因为邮件应用程序不可用。如果您在调用 launch 之前使用 canLaunch,您将获得更多信息。

          【讨论】:

            【解决方案6】:

            请试试这个,我用过这个,效果很好。

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

            【讨论】:

            • 我用您的代码的完整示例升级了帖子,但它不起作用
            • 我知道了,iOS模拟器上无法调用邮件应用
            • 在安卓模拟器上怎么样?我在应用启动、模拟器和设备上遇到了 android 崩溃。
            • 请在 url_launcher gitHub 中打开 Bug 问题。但它适用于电话。
            【解决方案7】:

            对于 iOS,我添加了这样的内容

            **

            _launchEmail() async {
                // ios specification
                final String subject = "Subject:";
                final String stringText = "Same Message:";
                String uri = 'mailto:administrator@gmail.com?subject=${Uri.encodeComponent(subject)}&body=${Uri.encodeComponent(stringText)}';
                if (await canLaunch(uri)) {
                  await launch(uri);
                } else {
                  print("No email client found");
                }
              }
            

            **

            【讨论】:

              【解决方案8】:

              对于 iOS

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

              【讨论】:

                猜你喜欢
                • 2019-12-31
                • 2019-03-04
                • 2021-05-05
                • 2021-05-10
                • 2023-03-28
                • 1970-01-01
                • 2021-01-08
                • 2012-01-02
                • 1970-01-01
                相关资源
                最近更新 更多