【问题标题】:how to allow mailto schemes in webview flutter如何允许 webview 中的 mailto 方案颤动
【发布时间】: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:")) {

【问题讨论】:

    标签: flutter flutterwebviewplugin


    【解决方案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
    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多