57

I have a simple web app I have created with flutter web. I would like to know how I can open new an external url either in a new tab or in the same tab in my flutter web app. say I want to open the url https://stackoverflow.com/questions/ask

13 Answers 13

82

I think you want this — dart:js enables interoperability between Dart and JS —:

import 'dart:js' as js; // ... FlatButton( child: Text('Button'), onPressed: () { js.context.callMethod('open', ['https://stackoverflow.com/questions/ask']); }, ) 
Sign up to request clarification or add additional context in comments.

7 Comments

lib/pages/home_page.dart:2:8: Error: Not found: 'dart:js' import 'dart:js' as js;
@AyushGupta what version of flutter are you using to help you out? I tried this it works as of flutter v1.12.1 on channel master.
Even i am on master channel. But now i guess url_launcher_web is available, so might not needing this. But i haven't tried
Heres how to open in new tab or same tab js.context.callMethod('open', ['$url', isNewTab ? '_blank' : '_self']); source: w3schools.com/jsref/met_win_open.asp
@MaheshJamdade your url should start with https://
|
36

As of url_launcher: ^6.3.1 The plugin has support for webOnlyWindowName property, You can declare a wrapper function below

Future<void> launch(String url, {bool isNewTab = true}) async { await launchUrl( Uri.parse(url), webOnlyWindowName: isNewTab ? '_blank' : '_self', ); } 

and use it like this

onTap:(){ launch('https://stackoverflow.com/questions/ask', isNewTab: true) } 

Comments

31

One simple way is to just create a button and use dart:html's window.open() method:

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

The name parameter — which I left as 'new tab' — refers to the new tab's window name, about which you can learn more from MDN's documentation.

7 Comments

How to prevent this from failing if I have an Android version too?
It doesn't work with the mobile browser? I vaguely remember testing it on the emulator, but I'm not sure.
Yes, conditional import it is!
To prevent this from failing on mobile instead of html package you can use universal_html
universal_html's window.open doesn't work unfortunately
|
16

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

url_launcher has been the solution for android and ios, recently it added support for web.

5 Comments

I am sorry, it does not say there how to use it. Could you please show me the code? I add import 'package:flutter/url_launcher.dart'; not even that works, there is no example
You can find documentation here pub.dev/packages/url_launcher
url_launcher can only open in new tabs/new window. The OP asked for "same tab" eventually.
Facing problem with Android 11
@MappaM webOnlyWindowName:'_self', do this.
11

Extending the answer of @xuyanjun which works fine when to want to open an external link from flutter web to a new tab. But if you want to open an external link to the website in the same tab in which the flutter web app is currently running.

then you can do it like this.

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

Explanation :- dart:js package from flutter provide the functionality to call web-specific functions like open function from flutter and all the strings in the list are parameter which are passed to the function refer this.

So if you want to open new tab then not need to pass seconds parameter but if you wan to open in same tab then pass _self as second parameter.

1 Comment

This is the correct answer! The marked as solved answer does still open in a new tab and is therefore not a complete answer to the authors question.
9

You can use the url_launcher plugin

Then in your code

import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher_string.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 canLaunchUrlString(url)) { await launchUrlString(url); } else { throw 'Could not launch $url'; } } 

Example taken from the package site

2 Comments

I have tried and It does not seem to work for me on flutter web
The _launchURL() code works. All that's needed here is to follow the instructions at github.com/flutter/plugins/tree/master/packages/url_launcher/…. Basically add the dependencies for both url_launcher and url_launcher_web in pubspec.yaml. Example: url_launcher: ^5.2.5 url_launcher_web: ^0.1.0
8

Answered here https://stackoverflow.com/a/56656885/361832

Flutter Web does not support plugins (yet), so you have to use replacements from dart:html

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

or

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

Comments

2

You can use the below code to launch the URL in the same tab.

window.top.location.href = '<your url>' 

Must import

import 'dart:html'; 

Comments

2

To launch URL you need to import url_launcher with latest version and you are good to launch URL through following code:

//Launch Github _launchGithub() async { const url = 'https://github.com/Pranav2918'; //Paste your URL string here if (await canLaunchUrlString(url)) { await launchUrlString(url); } else { throw 'Could not launch $url'; } } 
  • For non string URLs:

Another approach :

final Uri _url = Uri.parse('https://flutter.dev'); Future<void> _launchUrl() async { if (!await launchUrl(_url)) { throw 'Could not launch $_url'; } } 

Comments

1

package url_launcher now has web support.

just import url_launcher_web, and url_launcher to your pubspec.yaml

import 'package:url_launcher/url_launcher.dart'; const String _url = 'https://flutter.dev'; void _launchURL() { launch(_url); } 

Comments

1

I found that if you navigate from Flutter for web to a new browser tab, and if you then go back to the Flutter tab itself, then the widget stack is refreshed (by using the url_launcher plugin). This is unwanted behavior for me

Comments

0

dart:html is deprecated.

Import the "web" package (https://pub.dev/packages/web) :

import "package:web/web.dart"; void navigate(String url, {String target = "_self"}) { if (target == "_blank") { window.open(url, "_blank")?.focus(); } else { window.location.href = url; } } // In the current tab: navigate("https://stackoverflow.com/questions/ask"); // In another tab: navigate("https://stackoverflow.com/questions/ask", target: "_blank"); 

Comments

0

I'm new to Flutter, so here's a solution that worked in my project; it may not be the only way. I just wanted to provide my own version for new users like me.

Notes:

  • This uses package:web, which replaces the now-deprecated dart:html.

  • window.open(url, '_blank') attempts to open in a new tab, but if the browser blocks it (due to pop-up blockers or the Google App on iOS), it falls back to navigating in the current tab.

  • Calling openUrl(answerUrl, newTab: false) opens in the same tab.

import 'package:web/web.dart' as web; // link to open const answerUrl = 'https://stackoverflow.com/questions/ask'; // function to open link in new tab or same page void openUrl(String url, {bool newTab = true}) { try { if (newTab) { // opens new tab final newWindow = web.window.open(url, '_blank'); if (newWindow == null) { // Fallback if browser blocks the popup web.window.location.href = url; } } else { // Open directly in the same tab web.window.location.href = url; } } catch (_) { // Fallback for cases like Google App on iPhone web.window.location.href = url; } } // ... passing the link to the function inside onPressed ElevatedButton( onPressed: () => openUrl(answerUrl), child: const Text("Go to questions"), ) 

1 Comment

Just remember that the web dependency only works on the web platform. It won't work for iOS, macOS, Windows, etc. I recommend using the url_launcher dependency for those instances.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.