Flutter Webview - 在浏览器或窗口中打开外部链接

Posted

技术标签:

【中文标题】Flutter Webview - 在浏览器或窗口中打开外部链接【英文标题】:Flutter Webview - Opening External Links in Browser or Window 【发布时间】:2021-03-25 06:49:45 【问题描述】:

我有一个使用 Flutter Webview 制作的 android 应用。当用户单击外部链接时,我希望该链接在浏览器中打开。我该怎么做?

事实上,像 Instagram 那样在窗口中打开外部链接会很好。有没有办法做到这一点?

编辑:

website.com 是我应用的主页。那不是外部链接。我想要的是当尝试打开除 website.com 以外的链接时,它会在浏览器或窗口中打开。

首页:

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

class Forum extends StatefulWidget 
  @override
  _ForumState createState() => _ForumState();



class _ForumState extends State<Forum> 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Forum',
        home: Scaffold(
          body: WebView(initialUrl: "https://website.com",
            javascriptMode: JavascriptMode.unrestricted,
          ),
        )
    );
  

【问题讨论】:

这个问题存在于sample 【参考方案1】:

我遇到了完全相同的问题,我花了很多钱来解决它。 Akif,即使在您提出问题 5 个月后,我也会发布解决方案,因为我相信它仍然会帮助很多人。

下面的解决方案是使用 STANDART FLUTTER WEBVIEW 并同时使用 URL LAUNCHER。

url_launcherwebview_flutter 添加到您的文件pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  
  webview_flutter: ^1.0.5
  url_launcher: ^5.7.10

现在在您的网络视图中,它需要包含 navigationDelegate

见下文...

class MyApp extends StatelessWidget 
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
        title: 'Title Your App',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: Scaffold(
            body: Container(
          child: WebView(
            initialUrl: 'https://website.com',
            javascriptMode: JavascriptMode.unrestricted,
            onWebViewCreated: (WebViewController webViewController) 
              _controller.complete(webViewController);
            ,
            navigationDelegate: (NavigationRequest request) 
              if (request.url.startsWith("https://website.com")) 
                return NavigationDecision.navigate;
               else 
                _launchURL(request.url);
                return NavigationDecision.prevent;
              
            ,
          ),
        )));
  

  _launchURL(String url) async 
    if (await canLaunch(url)) 
      await launch(url);
     else 
      throw 'Could not launch $url';
    
  

别忘了你需要添加 URL LAUNCHER 依赖。

import 'package:url_launcher/url_launcher.dart';

解释:

此代码会导致在 webview 中发出的每个请求都通过以下测试:

如果请求地址以您的 webview 的起始地址开头,它通常会在 webview 中执行。 如果请求地址与您的 webview 的初始地址不同,它会将该请求发送到手机的默认浏览器。

我希望它可能仍然会帮助你,或者从现在开始它会帮助需要它的人。

拥抱。

【讨论】:

【参考方案2】:

如果你想在外部浏览器中打开链接,那么试试这个url_launcher

对于打开的浏览器,粘贴您的网址并在点击时调用它,

您也可以检查您的网址是否包含您的网站。之后您可以执行操作,

    onPressed: () 
            var myUrl="https://website.com";
            if(myUrl.contains("website.com"))
              //place your website code
              print("its my website ");
            else
              _launchURL(myUrl);
            
          



  _launchURL(String myUrl) async 
    if (await canLaunch(myUrl))
    
      await launch(myUrl);
     else 
      throw 'Could not launch $myUrl';
    
  

【讨论】:

website.com 是我应用的主页。那不是外部链接。我想要的是当尝试打开 website.com 以外的链接时,它会在浏览器中打开。 再次检查,我用你的网站 url 检查更新我的代码,【参考方案3】:

您可以使用 flutter_custom_tabs 插件在原生浏览器应用程序(Android 版 Google 和 ios 版 Safari)中打开该链接。

要安装它,您需要在您的pubspec.yaml 中的dependencies: 下方添加以下行:

flutter_custom_tabs: "^0.6.0"

并使用如下函数:

void _launchURL(BuildContext context, String url) async 
    try 
      await launch(
        url,
          extraCustomTabs: <String>[
            'org.mozilla.firefox',
            'com.microsoft.emmx',
          ],        
        ),
      );
     catch (e) 
      debugPrint(e.toString());
    

【讨论】:

【参考方案4】:

您可以使用url_launcher 插件来完成这项工作

为此,您需要在 pubspec.yaml 中添加插件

所以在 dependencies 下的 pubspec,yaml 文件中添加 url_launcher: ^5.7.10

这是一个启动网站的示例

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

void main() 
  runApp(Scaffold(
    body: Center(
      child: RaisedButton(
        onPressed: _launchURL,
        child: Text('Show Flutter homepage'),
      ),
    ),
  ));


_launchURL() async 
  const url = 'https:website.com';
  if (await canLaunch(url)) 
    await launch(url);
   else 
    throw 'Could not launch $url';
  

【讨论】:

website.com 是我应用的主页。那不是外部链接。我想要的是当尝试打开 website.com 以外的链接时,它会在浏览器中打开。 是的,您可以将website.com 替换为您想在浏览器中打开的任何其他链接 但是,我不知道应该在浏览器中打开的站点链接。 那你要在浏览器中打开什么,请清楚 Webview中显示的站点以外的所有链接

以上是关于Flutter Webview - 在浏览器或窗口中打开外部链接的主要内容,如果未能解决你的问题,请参考以下文章

flutter webview插件打开缩小窗口

Android在 Flutter 中使用 WebView

如何在不使用 webview 或浏览器的情况下实现 paypal?

如何在 Flutter 移动端、Web 端和窗口中添加条件导入?

打开 Flutter Webview 链接到浏览器

Flutter Webview - 如何在页面上添加更多链接或元素?