【问题标题】:How do I open an external url in flutter web in new tab or in same tab如何在新选项卡或同一选项卡中打开 Flutter Web 中的外部 URL
【发布时间】:2019-10-06 19:25:32
【问题描述】:

我有一个使用 Flutter Web 创建的简单 Web 应用程序。我想知道如何在我的颤振网络应用程序中的new tabthe same tab 中打开新的external url。说我要打开网址https://stackoverflow.com/questions/ask

【问题讨论】:

    标签: dart flutter flutter-web


    【解决方案1】:

    扩展@xuyanjun 的答案,当想要从flutter web 打开外部链接到新标签时效果很好。但是,如果您想在 Flutter Web 应用当前运行的同一选项卡中打开指向该网站的外部链接。

    那么你可以这样做。

    import 'dart:js' as js;
    // ...
    
    FlatButton(
      child: Text('Button'),
      onPressed: () {
        js.context.callMethod('open', ['https://blup.in/','_self']); //<= find explanation below
      },
    )
    
    

    解释:- 来自flutter的dart:js包提供了调用web特定函数的功能,比如来自flutter的open函数,列表中的所有字符串都是传递给函数的参数,参考this

    因此,如果您想打开新标签,则不需要传递 seconds 参数,但如果您想在同一个标​​签中打开,则传递 _self 作为第二个参数。

    【讨论】:

    • 这是正确答案! marked as solved 答案仍然在新选项卡中打开,因此不是对作者问题的完整答案。
    【解决方案2】:

    我想你想要这个——dart:js 启用 Dart 和 JS 之间的互操作性——:

    import 'dart:js' as js;
    
    // ...
    
    FlatButton(
      child: Text('Button'),
      onPressed: () {
        js.context.callMethod('open', ['https://stackoverflow.com/questions/ask']);
      },
    )
    

    【讨论】:

    • lib/pages/home_page.dart:2:8: 错误:未找到:'dart:js' import 'dart:js' as js;
    • @AyushGupta 你用什么版本的颤振来帮助你?我试过这个,它在频道主服务器上从颤振 v1.12.1 开始工作。
    • 即使我在主频道。但现在我猜 url_launcher_web 可用,所以可能不需要这个。但我没试过
    • 这里是如何在新标签或同一标签中打开 js.context.callMethod('open', ['$url', isNewTab ? '_blank' : '_self']); 来源:w3schools.com/jsref/met_win_open.asp
    【解决方案3】:

    一种简单的方法是只创建一个按钮并使用dart:htmlwindow.open() 方法:

    import 'dart:html' as html;
    
    // ...
    
    html.window.open('https://stackoverflow.com/questions/ask', 'new tab');
    

    name 参数(我保留为'new tab')指的是新标签的窗口名称,您可以从MDN's documentation 了解更多信息。

    【讨论】:

    • 如果我也有 Android 版本,如何防止失败?
    • 手机浏览器不行?我依稀记得在模拟器上测试过,但我不确定。
    • 我的 Flutter 应用程序同时具有 web 和 android 目标,但是 "import 'dart:html' as html;"在构建 Android 版本时将不起作用。那么如何防止该部分被编译为 Android 目标呢?
    • 这还是很奇怪,我认为dart:html 可以在 Android 上运行。我的模拟器通常是安卓。无论如何,也许您将不得不求助于conditional imports
    • 为了防止这在移动设备而不是 html 包上失败,您可以使用universal_html
    【解决方案4】:

    https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_web

    url_launcher一直是android和ios的解决方案,最近增加了对web的支持。

    【讨论】:

    • 对不起,这里没有说如何使用它。你能告诉我代码吗?我添加了 import 'package:flutter/url_launcher.dart';即使这样也行不通,没有例子
    • 你可以在这里找到文档pub.dev/packages/url_launcher
    • url_launcher 只能在新标签页/新窗口中打开。 OP 最终要求“相同的标签”。
    • Android 11 面临问题
    • @MappaM webOnlyWindowName:'_self', 这样做。
    【解决方案5】:

    在这里回答https://stackoverflow.com/a/56656885/361832

    Flutter Web 不支持插件(目前),所以你必须使用 dart:html 的替代品

    https://api.dartlang.org/stable/2.4.0/dart-html/Window/open.htmlwindow.open(url, 'tab');

    https://api.dartlang.org/stable/2.4.0/dart-html/Window/location.htmlwindow.location.assign(url);

    【讨论】:

      【解决方案6】:

      您可以使用url_launcher plugin

      然后在你的代码中

      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://flutter.io';
        if (await canLaunch(url)) {
          await launch(url);
        } else {
          throw 'Could not launch $url';
        }
      }
      

      示例取自包站点

      【讨论】:

      • 我已经尝试过,但在flutter web上似乎对我不起作用
      • _launchURL() 代码有效。这里需要做的就是按照github.com/flutter/plugins/tree/master/packages/url_launcher/… 的说明进行操作。基本上在 pubspec.yaml 中添加 both url_launcher 和 url_launcher_web 的依赖项。示例:url_launcher: ^5.2.5 url_launcher_web: ^0.1.0
      猜你喜欢
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2013-01-12
      • 2016-05-03
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      相关资源
      最近更新 更多