【发布时间】:2020-05-09 05:47:09
【问题描述】:
Flutter web 项目的默认 URL 定义了一个包含标签 (#) 的 URL,如下所示:
http://localhost:41521/#/peaple/...
我想删除这个“#”,如下所示:
http://localhost:41521/peaple/
我该如何解决这个问题?
【问题讨论】:
标签: flutter dart flutter-web
Flutter web 项目的默认 URL 定义了一个包含标签 (#) 的 URL,如下所示:
http://localhost:41521/#/peaple/...
我想删除这个“#”,如下所示:
http://localhost:41521/peaple/
我该如何解决这个问题?
【问题讨论】:
标签: flutter dart flutter-web
在 pubspec.yaml 中添加这个
dependencies:
flutter_web_plugins:
sdk: flutter
在 main.dart 文件中将 cofigureApp 添加到应用程序的根目录并添加此导入
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
void configureApp() {
setUrlStrategy(PathUrlStrategy());
}
void main() {
WidgetsFlutterBinding.ensureInitialized();
configureApp();
runApp(MyApp());
}
重启网络应用
出来会是这样的
http://localhost:52299/login_page
【讨论】:
仅适用于 Github 页面托管
这也适用于不是直接从 domain.com/ 而是从某个路径 domain.com/path/ 提供的应用。
您需要将您的 repo 名称添加到 base href 否则您的网站将无法运行。
<base href="/REPO_NAME/">
【讨论】:
您现在可以使用简单包和单行代码从 Flutter Web 应用程序中删除前导哈希 (#) :url_strategy(完全披露:我是作者)
url_strategy
您只需添加依赖项as described here,然后将以下函数调用添加到您的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());
}
您只需拨打setPathUrlStrategy ?
该软件包还确保运行代码不会在移动设备上崩溃(见下文)。此外,如果您在stable 上构建您的移动应用程序并且仅在beta 上构建Web,这也将在stable 上运行。
使用路径 URL 策略时,您需要确保在 web/index.html 的 <head> 部分中包含 <base href="/">。
这是在创建新的 Flutter 应用时添加的默认。
此外,当部署您的生产应用程序时,您需要确保每条路径都指向您的index.html。如果您使用 Firebase 托管等工具,则在将您的应用配置为单页应用时会自动为您完成这项工作。
否则,您需要查找如何为您正在使用的主机重写所有到您的 index.html 的路径。
基本上,您希望拥有一个单页应用程序,其中 HTTP 服务器为所有路径提供 index.html。
包实现基于使用flutter_web_plugins 的手动解决方案。使用该软件包的好处如下:
stable 上不会出现任何遗漏的实施问题(因为网络功能仍在beta 上)。【讨论】:
以下答案复制自 Mouad Debbar 在 GitHub (see issue comment) 上的解释。
一旦它可用,以下是使用它的步骤:
在web/index.html 文件的<head> 部分中添加<base href="/">。这将自动添加到由 flutter create 创建的新项目中。但是对于现有的应用程序,开发者需要手动添加。
在 pubspec.yaml 中添加 flutter_web_plugins 依赖项(如果它尚不存在):
dependencies:
flutter_web_plugins:
sdk: flutter
添加lib/configure_nonweb.dart,内容如下:
void configureApp() {
// No-op.
}
添加lib/configure_web.dart,内容如下:
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
void configureApp() {
setUrlStrategy(PathUrlStrategy());
}
在lib/main.dart 中,执行以下操作:
import 'package:flutter/material.dart';
import 'configure_nonweb.dart' if (dart.library.html) 'configure_web.dart';
void main() {
configureApp();
runApp(MyApp());
}
【讨论】:
/app/ 之类的其他东西,这是否有效?
如果您只关心路由,您可以这样做:
onGenerateRoute: (settings) {
List segments = settings.name.split('/').where((x) => ! x.isEmpty).toList();
String page = segments.length > 0 ? segments[0] : '';
...
}
}
【讨论】:
MaterialApp() 小部件中