如何从 Flutter web 中的 URL 中删除哈希 (#)

Ede*_*ril 44 dart flutter flutter-web

Flutter Web 项目的默认 URL 定义了一个包含 hashtag ( #)的 URL ,如下所示:

http://localhost:41521/#/peaple/...
Run Code Online (Sandbox Code Playgroud)

我想删除这个“#”,看起来像这样:

http://localhost:41521/peaple/
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

cre*_*not 51

您现在可以使用一个简单的包一行代码从您的 Flutter Web 应用程序中删除前导哈希 (#):(url_strategy完全披露:我是作者)

使用 url_strategy

您只需按照此处所述添加依赖项,然后将以下函数调用添加到您的main函数中:

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());
}
Run Code Online (Sandbox Code Playgroud)

打电话setPathUrlStrategy就是你需要做的一切


该包还确保运行代码不会在移动设备上崩溃(见下文)。此外,stable如果您stablebeta.

笔记

您需要确保在使用路径 URL 策略时包含<base href="/">在您的<head>部分中web/index.html
这是在创建新的 Flutter 应用程序时默认添加

此外,当部署您的生产应用程序,你需要确保每一条路径指向你index.html。如果您使用 Firebase 托管等工具,则在将您的应用配置为单页应用时会自动为您完成此操作。
否则,您想查找如何为index.html您正在使用的主机重写所有路径。

本质上,您希望拥有一个单页应用程序,其中 HTTP 服务器index.html为所有路径提供服务。


包实现基于使用flutter_web_plugins. 使用该软件包的好处如下:

  • 只需要调用一个函数。
  • 无需使用条件导入(该包为您完成)。
  • 您不会遇到任何缺失的实施问题stable(因为网络功能仍在 上beta)。

  • 您可以通过将 thnis 添加到 firebase.json 中的“托管”字段来将所有路径重定向到 index.html: "rewrites": [ { "source": "**", "destination": "/index.html ” }] (4认同)
  • 默认情况下,Flutter 使用哈希(/#/)位置策略。哈希有什么好处? (2认同)

小智 12

以下答案复制自 Mouad Debbar 在 GitHub 上的解释(请参阅问题评论)。


以下是它可用后的使用步骤:

<base href="/">在文件的<head>部分内添加web/index.html。这将自动为 flutter create 创建的新项目添加。但是对于现有的应用程序,开发人员需要手动添加。如果flutter_web_plugins依赖项pubspec.yaml尚不存在,则添加依赖项:

dependencies:
  flutter_web_plugins:
    sdk: flutter
Run Code Online (Sandbox Code Playgroud)

添加一个lib/configure_nonweb.dart内容如下:

void configureApp() {
  // No-op.
}
Run Code Online (Sandbox Code Playgroud)

添加一个lib/configure_web.dart内容如下:

import 'package:flutter_web_plugins/flutter_web_plugins.dart';

void configureApp() {
  setUrlStrategy(PathUrlStrategy());
}
Run Code Online (Sandbox Code Playgroud)

在 中lib/main.dart,执行以下操作:

import 'package:flutter/material.dart';
import 'configure_nonweb.dart' if (dart.library.html) 'configure_web.dart';

void main() {
  configureApp();
  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个答案,因为它不依赖于包,而且实际上只是一些非常简单的更改。出于基础设施和长期支持的原因,依赖 url_strategy 包进行如此简单的编辑是一个坏主意。 (3认同)

Asa*_*saf 6

对于 2023 年到来的用户,Flutter 现在在其官方文档中解释了如何执行此操作。 \n(在撰写本文时)他们没有提及的一件事是如何更新pubspec.yaml文件。

\n

第 1 步:更新 pubspec.yaml,如下所示。

\n
dependencies:\n  flutter:\n    sdk: flutter\n  flutter_web_plugins: # add this line\n    sdk: flutter       # and this line\n
Run Code Online (Sandbox Code Playgroud)\n

第2步:运行flutter pub get

\n

步骤3:更新main.dart如下。

\n
import \'package:flutter_web_plugins/url_strategy.dart\'; // add this import\n\nvoid main() {\n  usePathUrlStrategy(); // and this line\n  runApp(ExampleApp());\n}\n
Run Code Online (Sandbox Code Playgroud)\n

第 4 步:请注意下面 Flutter 关于运行本地 flutter web 的建议。

\n
\n

通过运行创建的本地开发服务器flutter run -d chrome\n配置为正常处理任何路径并回退到您的 app\xe2\x80\x99s\nindex.html 文件。

\n
\n

我个人喜欢在固定端口上运行它flutter run -d chrome --web-port=3000

\n

干杯!

\n

flutter_supabase这帮助我解决了使用and实现 magic-link auth 时的重定向问题go_router(我为搜索引擎爬虫提到了这一点,以防它对其他人有帮助)。

\n