如何从我的 Flutter 代码打开 Web 浏览器 (URL)?

How do I open a web browser (URL) from my Flutter code?

我正在构建一个 Flutter 应用程序,我想在 Web 浏览器或浏览器 window 中打开 URL(响应按钮点击)。我该怎么做?

TL;DR

现在实现为 Plugin

const url = "https://flutter.io";
if (await canLaunch(url))
  await launch(url);
else 
  // can't launch url, there is some error
  throw "Could not launch $url";

完整示例:

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

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

_launchURL() async {
  const url = 'https://flutter.io';
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw 'Could not launch $url';
  }
}

在pubspec.yaml

dependencies:
  url_launcher: ^5.7.10

特殊字符:

如果 url 值包含现在 URL 中允许的空格或其他值,请使用

Uri.encodeFull(urlString)Uri.encodeComponent(urlString) 并传递结果值。

经过一番搜索,可以通过此处列出的说明解决此问题:https://groups.google.com/forum/#!topic/flutter-dev/J3ujgdOuG98

上面的UrlLauncher已经不能用了。

如果您想使用 url_launcher,请按此格式使用

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  url_launcher: ^5.0.2
  flutter:
    sdk: flutter

这个答案也是给绝对初学者的:他们在思考flutter sdk背后的问题。 不,那是失败的。这些包是额外的,不在 flutter Sdk 中。这些是二级包(单个小框架助手)。

对于颤振:

如 Günter Zöchbauer 所述

对于 Flutter Web:

import 'dart:html' as html;

然后使用:

html.window.open(url, name);

确保 运行 flutter clean 如果 import 没有解决。

使用 url_launcher 包。它会为你做这件事

最好的方法是使用url_launcher包。

在您的 pubspec.yaml 文件中添加 url_launcher 作为依赖项。

dependencies:
  url_launcher: ^5.7.10

如何使用它的示例:

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

void main() {
  runApp(
    MaterialApp(
        home: Scaffold(
      appBar: AppBar(title: Text('Flutter is beautiful'),),
      body: Center(
        child: RaisedButton(
          onPressed: _launchURL,
          child: Text('Show Flutter homepage'),
        ),
      ),
    )),
  );
}

_launchURL() async {
  const url = 'https://flutter.dev';
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw 'Could not launch $url';
  }
}

输出:

The launch method takes a string argument containing a URL . By default, Android opens up a browser when handling URLs. You can pass forceWebView: true parameter to tell the plugin to open a WebView instead. If you do this for a URL of a page containing JavaScript, make sure to pass in enableJavaScript: true, or else the launch method will not work properly. On iOS, the default behavior is to open all web URLs within the app. Everything else is redirected to the app handler.

如果您的目标是 sdk 30 或更高版本,canLaunch 由于包可见性的变化,默认情况下 return 为 false:https://developer.android.com/training/basics/intents/package-visibility

androidManifest.xml 中,您需要添加以下内容

<queries>
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https" />
    </intent>
</queries>

那么下面应该是word

const url = "https://flutter.io";
if (await canLaunch(url)){
  await launch(url);
}
else {
  // can't launch url
}

对于那些想要通过使用 url_launcher 实现启动浏览器和退出应用程序的人。请记住使用 (forceSafariVC: false) 在 phone 的默认浏览器中打开 url。否则,启动的浏览器会随着您的APP一起退出。

await launch(URL, forceSafariVC: false);