Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove hash (#) from URL in Flutter web

The default URL of a Flutter web project defines a URL containing a hashtag (#), as follows:

http://localhost:41521/#/peaple/... 

I would like to remove this '#', looking like this:

http://localhost:41521/peaple/ 

How can I solve this problem?

like image 884
Edeson Bizerril Avatar asked Jan 23 '20 01:01

Edeson Bizerril


People also ask

What does hash in URL mean?

In a URL, a hash mark, number sign, or pound sign ( # ) points a browser to a specific spot in a page or website. It is used to separate the URI of an object from a fragment identifier. When you use a URL with a # , it doesn't always go to the correct part of the page or website.

What does Window location replace do?

Window location. The replace() method replaces the current document with a new one.

What does Window location Search do?

Window location.search The search property returns the querystring part of a URL, including the question mark (?). The search property can also be used to set the querystring.


2 Answers

You can now use a simple package and a single line of code to remove the leading hash (#) from your Flutter web app: url_strategy (full disclosure: I am the author)

Using url_strategy

You simply add the dependency as described here and then add the following function call to your main function:

import 'package:url_strategy/url_strategy.dart';  void main() {   // Here we set the URL strategy for our web app.   // It is safe to call this function when running on mobile or desktop as well.   setPathUrlStrategy();   runApp(MyApp()); } 

Calling setPathUrlStrategy is all you need to do 🎉


The package also ensures that running the code will not crash on mobile (see below). Additionally, this will also run on stable if you build your mobile app on stable and only web on beta.

Notes

You need to make sure that you include <base href="/"> inside the <head> section of your web/index.html when using the path URL strategy.
This is added by default when creating a new Flutter app.

Furthermore, when deploying your production app, you need to make sure that every path points to your index.html. If you use tools like Firebase hosting, this is done automatically for you when configuring your app as a single page app.
Otherwise, you want to look up how to rewrite all paths to your index.html for the hosting you are using.

Essentially, you want to have a single page app, where the HTTP server serves the index.html for all paths.


The package implementation is based on the manual solution using flutter_web_plugins. The benefits of using the package are the following:

  • Only need to call a single function.
  • No need to use conditional imports (the package does it for you).
  • You will not get any missing implementation issues on stable (as the web feature is still on beta).
like image 98
creativecreatorormaybenot Avatar answered Oct 02 '22 23:10

creativecreatorormaybenot


The following answer is copied from Mouad Debbar's explanation on GitHub (see issue comment).


Here are the steps to use it once it's available:

Add <base href="/"> inside the <head> section of your web/index.html file. This will be added automatically for new projects created by flutter create. But for existing apps, the developer needs to add it manually. Add the flutter_web_plugins dependency in pubspec.yaml if it doesn't already exist:

dependencies:   flutter_web_plugins:     sdk: flutter 

Add a lib/configure_nonweb.dart with the following content:

void configureApp() {   // No-op. } 

Add a lib/configure_web.dart with the following content:

import 'package:flutter_web_plugins/flutter_web_plugins.dart';  void configureApp() {   setUrlStrategy(PathUrlStrategy()); } 

In lib/main.dart, do the following:

import 'package:flutter/material.dart'; import 'configure_nonweb.dart' if (dart.library.html) 'configure_web.dart';  void main() {   configureApp();   runApp(MyApp()); } 
like image 41
Tarek Alabd Avatar answered Oct 03 '22 00:10

Tarek Alabd