寫在前面
Flutter 是 Google推出並開源的移動應用開發框架,主打跨平臺、高保真、高效能。開發者可以通過 Dart語言開發 App,一套程式碼同時執行在 iOS 、Android、web和桌面端。
Flutter官網:flutter-io.cn
Flutter_web是Flutter程式碼相容web的實現,可以將使用Dart編寫的現有Flutter程式碼編譯成可以嵌入瀏覽器並部署到任何Web伺服器的客戶端。
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.
Flutter的目標是通過單一程式碼庫同時構建移動和Web應用程式。 但是,為了進行實驗,Flutter_web是在一個單獨的名稱空間中開發的。 因此,截至目前,現有的移動Flutter應用程式無法在不進行更改的情況下在Web上執行。
簡而言之就是Flutter現在還不支援既是移動應用也是Web應用,需要自己進行遷移,但相信日子不會太遠。
遷移Flutter專案到WEB端
這次我們遷移的專案是flutter_challenge_googlemaps,效果圖如下:
怎麼做?
大多數Dart程式碼都是共用的,需要改變的只是一些依賴和配置。
首先是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