Flutter for web
是Flutter
的框架的兼容实现,使用HTML,CSS和JavaScript等基于标准的Web技术呈现。javascript
结合使用DOM
,Canvas
和CSS
,Flutter
可以在现代浏览器中提供便携,高质量的web
体验。 Flutter
在Dart
中彻底实现了核心绘图层,并使用Dart
优化的JavaScript
编译器将Flutter
核心和框架与应用程序一块儿编译成一个能够部署到任何Web
服务器的简化源文件。html
在官方的介绍中,在早期的开发阶段,Flutter for web
将会实现不少场景:java
Flutter
构建渐进式Web
应用程序。 对Flutter
的Web
支持使现有的基于移动的应用程序能够打包为PWA
,以支持更普遍的设备,或为现有应用程序提供配套的Web
体验。Web
内容。 Flutter
为建立丰富的,以数据为中心的组件提供了一个强大的环境,能够轻松地在现有网页中托管。 不管是数据可视化,在线工具如汽车配置器仍是嵌入式图表,Flutter
均可觉得嵌入式Web
内容提供高效的开发方法。Flutter
移动应用中嵌入Web
内容。 在现有移动应用程序内提供动态内容更新的既定方法是使用Web
视图控件,其能够动态地加载和显示信息。 Flutter
将支持如今提供统一的Web
和移动内容环境,能够在线部署内容或嵌入应用程序而无需重写。 总而言之其目标是将Web
支持做为Flutter SDK
中的与iOS
和Android
一致的第一级别平台。 Flutter for web
是实现该目标的跳板,提供实现几乎整个Flutter API
的纯Web
包。git
Flutter Team
正在Flutter repo
的分支中开发Flutter for web
。 这样能够实现快速迭代,同时保持核心Flutter repo
稳定。Flutter Team
已经开始将Web
代码合并到核心存储库中。 最终,将拥有一个SDK/Framework
,其中包含一组适用于全部平台的Widget
。Flutter
小部件API
与移动小部件API
相同,它们只是单独临时打包的。 要想体验Flutter for web
能够克隆其仓库进行体验。github
Flutter team
将打算在现代浏览器中彻底支持Flutter
的全部API
和功能。 可是,在此预览版本汇总,有许多例外状况:web
flutter_web
尚未插件系统。 咱们暂时提供对dart:html
,dart:js
,dart:svg
,dart:indexed_db
以及其余容许访问绝大多数浏览器API
的Web库
的访问。 可是,将来这些库将被不一样的插件API
替换。Flutter API
都在Flutter for web
上实现。Flutter for web
生成的代码可能运行缓慢,或者会出现UI
卡顿。UI
交互并不彻底。Chrome
。 Flutter for web
提供了:json
使用生产阶段的编译器构建时,将支持Chromium
的浏览器和Safari
。还旨在全面支持Firefox
和Edge
做为目标平台,但测试覆盖率在这些浏览器上仍然很低。 Flutter team
的目的是支持当前和最后两个主要版本。未计划对Internet Explorer
的支持。浏览器
开发阶段的编译器目前仅支持Chrome
。性能优化
Flutter 1.5
及更高版本才能支持使用Flutter for Web
,包括将Dart
编译为JavaScript
。 要将Flutter SDK
与flutter_web
预览一块儿使用,请确保flutter upgrade
将Flutter
升级到至少v1.5.4。bash
克隆flutter_web
源代码
安装flutter_web
构建工具
flutter pub global activate webdev
复制代码
确保$HOME/.pub-cache/bin
目录位于系统路径中,而后能够直接从终端使用webdev
命令。
注意:若是在配置
webdev
以直接运行时遇到问题,请尝试:flutter pub global run webdev [command]
。
运行demo
该demo在存储库中的examples/hello_world
中
flutter packages upgrade
复制代码
webdev serve
复制代码
在Chrome
中打开http://localhost:8080
,能够在左上角看到红色文字的Hello World
。
若是想在不克隆存储库的状况下依赖flutter_web
软件包,能够按以下方式设置pubspec
:
name: my_flutter_web_app
environment:
sdk: '>=2.2.0 <3.0.0'
dependencies:
flutter_web: any
flutter_web_ui: any
dev_dependencies:
# Enables the `pub run build_runner` command
build_runner: ^1.1.2
# Includes the JavaScript compilers
build_web_compilers: ^1.0.0
# flutter_web packages are not published to pub.dartlang.org
# These overrides tell the package tools to get them from GitHub
dependency_overrides:
flutter_web:
git:
url: https://github.com/flutter/flutter_web
path: packages/flutter_web
flutter_web_ui:
git:
url: https://github.com/flutter/flutter_web
path: packages/flutter_web_ui
复制代码
要使用热重载,使用webdev
,在项目目录中运行如下命令:
webdev serve --auto restart
复制代码
你会注意到flutter pub run build_runner
服务的相似输出,但如今更改应用程序代码会致使在保存时快速刷新应用程序。
注意:--hot-reload选项并不完美。 若是发现意外行为,则可能须要手动刷新页面。
上面介绍的(可与build_runner
和webdev
一块儿使用)使用Dart Dev Compiler
的工做流程,该编译器专为快速,增量编译和轻松调试而设计。
若是想评估生产阶段的性能,浏览器兼容性和代码大小等,能够启用发布编译器dart2js。
webdev serve -r
复制代码
注意:此配置的构建可能会很慢。
webdev
。webdev build
复制代码
这将建立一个包含index.html
,main.dart.js
的构建目录以及使用静态HTTP
服务器运行应用程序所需的其他文件。 要优化输出JavaScript
,可使用项目根目录中的build.yaml
文件启用优化标志,其中包含如下内容:
# See https://github.com/dart-lang/build/tree/master/build_web_compilers#configuration
targets:
$default:
builders:
build_web_compilers|entrypoint:
generate_for:
- web/**.dart
options:
dart2js_args:
- --no-source-maps
- -O4
复制代码
注意:-O4选项启用了许多高级优化,这些优化可能会致使未通过全面测试的代码中出现运行时错误。
为了进行实验,Flutter for web
是在一个单独的命名空间中开发的。 所以,截至目前,现有的移动Flutter
应用程序没法在不进行更改的状况下在Web
上运行。
若是正在使用Git,建议暂时在项目存储库中建立特定于Web
的分支。
name: my_app
version: 1.0.0
dependencies:
## REPLACE
## Update your dependencies to use `flutter_web`
#flutter:
# sdk: flutter
flutter_web: any
dev_dependencies:
## REPLACE
## Same goes for test packages
#flutter_test:
# sdk: flutter
flutter_web_test: any
## ADD
## Add these dependencies to enable the Dart web build system
build_runner: ^1.2.2
build_web_compilers: ^1.1.0
test: ^1.3.4
## REMOVE
## For the preview, assets are handled differently. Remove or comment
## out this section. See `Assets` below for more details
# flutter:
# uses-material-design: true
# assets:
# - asset/
#
# fonts:
# - family: Plaster
# fonts:
# - asset: asset/fonts/plaster/Plaster-Regular.ttf
## ADD
## flutter_web packages are not published to pub.dartlang.org
## These overrides tell the package tools to get them from GitHub
dependency_overrides:
flutter_web:
git:
url: https://github.com/flutter/flutter_web
path: packages/flutter_web
flutter_web_ui:
git:
url: https://github.com/flutter/flutter_web
path: packages/flutter_web_ui
flutter_web_test:
git:
url: https://github.com/flutter/flutter_web
path: packages/flutter_web_test
复制代码
将package:flutter
更改成package:flutter_web
。
将dart:ui
更改成package:flutter_web_ui:ui.dart
。
须要建立
这些文件为应用程序提供了一个入口点。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script defer src="main.dart.js" type="application/javascript"></script>
</head>
<body>
</body>
</html>
复制代码
import 'package:flutter_web_ui/ui.dart' as ui;
// TODO: change `my_app` to refer to your app package name.
import 'package:my_app/main.dart' as app;
main() async {
await ui.webOnlyInitializePlatform();
app.main();
}
复制代码
若是应用程序有assets
,则它们必须位于web/assets
目录中。可能还须要更新源代码中引用这些assets
的路径。
若是应用程序具备自定义字体,则须要将其包含在此文件中。
[
{
"family": "Raleway",
"fonts": [
{
"asset": "fonts/Raleway-Regular.ttf"
},
{
"asset": "fonts/Raleway-Italic.ttf",
"style": "italic"
}
]
},
{
"family": "RobotoMono",
"fonts": [
{
"asset": "fonts/RobotoMono-Regular.ttf"
},
{
"asset": "fonts/RobotoMono-Bold.ttf",
"weight": 700
}
]
}
]
复制代码