如何允许 webview 中的 mailto 方案颤动

Posted

技术标签:

【中文标题】如何允许 webview 中的 mailto 方案颤动【英文标题】:how to allow mailto schemes in webview flutter 【发布时间】:2021-04-29 00:17:12 【问题描述】:

我正在使用 Flutter Webview 插件开发 Flutter webview 应用程序。

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:url_launcher/url_launcher.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
        home: Scaffold(
            body: SafeArea(
              child : const WebView(
                initialUrl: 'https://google.com',
                javascriptMode: JavascriptMode.unrestricted,
              ),
            )
        )
    );
  

但是,如果打开的网页中的任何链接是应用链接,例如:fb://profile,我会得到 net::ERR_UNKNOWN_URL_SCHEME。

android中,我发现解决方案是覆盖here中提到的shouldOverrideUrlLoading,但是在flutter中我应该怎么做?

我正在尝试here 提到的解决方案。

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:url_launcher/url_launcher.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
        home: Scaffold(
            body: SafeArea(
              child : const WebView(
                initialUrl: 'https://google.com',
                javascriptMode: JavascriptMode.unrestricted,
                navigationDelegate: (NavigationRequest request)  
                  if (request.url.contains("mailto:")) 
                    launch(request.url);
                    return NavigationDecision.navigate;
                  
                ,
              ),
            )
        )
    );
  

但它会抛出类似的错误

错误:不是常量表达式。 if (request.url.contains("mailto:"))

【问题讨论】:

【参考方案1】:

您可以在下面复制粘贴运行完整代码 第 1 步:您可以从 const WebView 中删除 const 关键字 第 2 步:您可以使用NavigationDecision.prevent

工作演示

完整代码

import 'package:flutter/material.dart'; 导入'包:webview_flutter/webview_flutter.dart'; 导入'package:url_launcher/url_launcher.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
        home: Scaffold(
            body: SafeArea(
      child: WebView(
        initialUrl:
            'https://google.com', //'''https://www.scottseverance.us/mailto.html',
        javascriptMode: JavascriptMode.unrestricted,
        navigationDelegate: (NavigationRequest request) 
          print(request.url);
          if (request.url.contains("mailto:")) 
            launch(request.url);
            return NavigationDecision.prevent;
           else 
            return NavigationDecision.navigate;
          
        ,
      ),
    )));
  

【讨论】:

该方法运行良好。但修改后,手机打不开应用。此外,锚标签在模拟器上不起作用。 我已经更新了完整代码,你可以添加 else return NavigationDecision.navigate

以上是关于如何允许 webview 中的 mailto 方案颤动的主要内容,如果未能解决你的问题,请参考以下文章

mailto:UIWebView 中的链接 - 不起作用

QWebView mailto 问题

你如何创建一个mailto:没有(to)部分的链接

如何模拟 Winforms 按钮单击上的“mailto:”调用?

如何仅为密件抄送设置 mailto

允许在 WebView 中的长按触摸事件上选择文本