Flutter 是 Google推出並開源的移動應用開發框架,主打跨平臺、高保真、高性能。開發者能夠經過 Dart語言開發 App,一套代碼同時運行在 iOS 、Android、web和桌面端。javascript
Flutter官網:flutter-io.cnhtml
Flutter_web是Flutter代碼兼容web的實現,能夠將使用Dart編寫的現有Flutter代碼編譯成能夠嵌入瀏覽器並部署到任何Web服務器的客戶端。java
Our goal is to enable building applications for mobile and web simultaneously from a single codebase. However, to allow experimentation, the tech preview Flutter for web is developed in a separate namespace. So, as of today an existing mobile Flutter application will not run on the web without changes.git
Flutter的目標是經過單一代碼庫同時構建移動和Web應用程序。 可是,爲了進行實驗,Flutter_web是在一個單獨的命名空間中開發的。 所以,截至目前,現有的移動Flutter應用程序沒法在不進行更改的狀況下在Web上運行。github
簡而言之就是Flutter如今還不支持既是移動應用也是Web應用,須要本身進行遷移,但相信日子不會太遠。web
此次咱們遷移的項目是flutter_challenge_googlemaps,效果圖以下:編程
大多數Dart代碼都是共用的,須要改變的只是一些依賴和配置。json
首先是pubspec.yaml
須要用flutter_web來替換flutter,同時移除asset和字體相關的代碼。瀏覽器
name: flutter_web_challenge_googlemaps
environment:
# You must be using Flutter >=1.5.0 or Dart >=2.3.0
sdk: '>=2.3.0-dev.0.1 <3.0.0'
dependencies:
flutter_web: any
flutter_web_ui: any
dev_dependencies:
build_runner: ^1.4.0
build_web_compilers: ^2.0.0
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
複製代碼
經過flutter package get
更新依賴後,須要更新lib
路徑下dart文件中的相關引用。服務器
//flutter
import 'package:flutter/material.dart';
//flutter web
import 'package:flutter_web/material.dart';
複製代碼
差異就是將flutter
替換爲flutter_web
而已,代碼基本不用動。
接下來,爲了預覽網頁,咱們須要本身建立web目錄,並在目錄下建立web/index.html
和 web/main.dart
文件。
web/index.html
<!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>
複製代碼
web/main.dart
import 'package:flutter_web_ui/ui.dart' as ui;
// 將flutter_web_challenge_googlemaps替換爲本身的package
import 'package:flutter_web_challenge_googlemaps/main.dart' as app;
main() async {
await ui.webOnlyInitializePlatform();
app.main();
}
複製代碼
至於資源文件、圖片、字體等,和Flutter項目不一樣,這些都須要放到web\assets
目錄路徑下,同時要記得更新代碼中的相關引用。
Image.asset("assets/logo.ong");
// 須要更改成
Image.asset("logo.png");
複製代碼
若是你有使用Material Icon的話,你須要在web/assets
目錄下建立FontManifest.json
文件,並添加相關地址。
[
{
"family": "MaterialIcons",
"fonts": [
{
"asset": "https://fonts.gstatic.com/s/materialicons/v42/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.woff2"
}
]
}
]
複製代碼
整個web目錄會以下圖所示:
運行項目,能夠發現和移動端基本沒有區別。
效果仍是蠻流暢的🤙。
若是你想查看release版本,能夠運行
flutter pub global run webdev serve -r
若是你想發佈製品,則能夠運行
flutter pub global run webdev build
這會在項目的根路徑下生成一個build文件夾,裏面包含能夠部署到服務器上的文件,以下圖所示:
你能夠運用gh-pages簡單的將其部署到Github上,而後預覽效果
flutter-ui-challenges.github.io/flutter_web…
關於如何運用gh-pages進行頁面預覽,能夠查看此連接:www.cnblogs.com/MuYunyun/p/…
雖說跨平臺的項目不少的,好比weex、RN、Kotlin等等,可是真正讓我體會到跨平臺高效一體的體驗仍是Flutter,這也許就是爲何年後我一直在學習和從事Flutter開發的緣由之一了。
固然flutter_web還處於早期階段,一些flutter的功能尚未徹底移植過來,好比高斯模糊效果,不過Flutter1.0正式版本纔到來不久,相信在不久的未來,這些全都會有。
最後附上相關地址:github.com/flutter-ui-…,本文是爲了方便查看因此新開了一個倉庫,實際上只須要新開一個web分支就能夠了。
flutter_web:github.com/flutter/flu…
==================== 分割線 ======================
若是你想了解更多關於MVVM、Flutter、響應式編程方面的知識,歡迎關注我。
你能夠在如下地方找到我:
簡書:www.jianshu.com/u/117f1cf0c…
Github: github.com/ditclear