其實背景很少說, Flutter for Web
是 Google大會
伴隨 Flutter 發佈了1.5.4版本推出了Flutter for Web的預覽版。javascript
從5月後到目前(9月)業內對於 Flutter for Web
的觀點,也是喜憂參半。html
目前官方自述的問題包括一下內容:前端
Api
jank
flutter_web
在PC瀏覽器上運行,運行的用戶界面像手機APP同樣儘管 Flutter for Web
還有這樣或者那樣的問題,可是還好他只是 預覽版
, 將來可期,畢竟 Google
仍是有無限可能。 同時筆者經過一些渠道瞭解到,Flutter for Web
年末還有大動做。java
下面是 Flutter
官方的2019年,是「 Google的一個早期採用者計劃 」,其中提到: 「 優秀的候選人將參與到引人注目的場景中,計劃在2019年末將有一個基於 Flutter web
的體驗發佈 」。webpack
筆者所在的團隊以前開發了 FLutter Go
這個「 幫助 FLutter 開發者快速上手的 APP 」,受到了一些 Flutter 入門開發者的承認。若是不瞭解這個項目請移步到 這裏。git
當 FLutter Go
遇到Flutter for Web
,如同牛奶遇到咖啡,咱們必須作點什麼.github
Flutter for Web
到底如何;Flutter native
到 Flutter-web
的開發者,摸石頭趟條路,畢竟從native
到 web
,並非一鍵生成的,還有許多坑要填。
Flutter-Go-Web
支持尚不穩定。咱們將此版本指定爲技術預覽版; 對Flutter Go native
版本移植還原度大概在 80%左右。旨在幫助Flutter
開發人員,快速熟悉Flutter-web
官方的實踐。web
在
Flutter
官方宣佈Flutter暫時不會開發熱更新(Code push) 以後,Flutter-web
無疑是的動態更新代碼最快捷的方式,雖然不是最佳方案,可是是最易用降級方案。json
經過
Flutter-go-web
版本的學習,能夠快速,有效還原Flutter-go
native 版本。幫助開發者,對快速版本H5化,作一個樣例展現,提供Flutter-web
的能力演示。vim
言歸正傳,開發前仍是建議你們對 Flutter-web
有一個基本的瞭解。若是熟悉請忽略。
輸入命令從 pub.dev 的鏡像拉取 webdev程序,webdev 相似於前端的構建工具
$ flutter pub global activate webdev
複製代碼
確保 $HOME/.pub-cache/bin 這個環境變量存在,環境變量在 vim ~/.bash_profile 裏修改
// ~/.bash_profile 加上這句
$ export PATH="$PATH":"$HOME/.pub-cache/bin"
複製代碼
flutter_web
示例
Flutter-web
版本都是基於,web版本的packages
包,因此要另起一個新的工程。 爲了不建立的不一致性,基於官方的 flutter_web 示例作更改
$ git clone https://github.com/flutter/flutter_web.git flutter_go_web
複製代碼
flutter_go_web
項目因爲咱們只有一個目標項目,因此能夠刪除 examples 目錄,替換成
Flutter Go
項目開發。
$ cd flutter_go_web
$ rm -rf examples
複製代碼
yaml
文件在項目根目錄,須要建立兩個關鍵的
.yaml
文件 build.yaml 是發佈版本的必要的配置 pubspec.yaml 是全部依賴配置,相似於 webpack 裏的 package.json 這兩個配置內容分別以下:
# build.yaml
targets:
$default:
builders:
build_web_compilers|entrypoint:
# Avoid building the test directory.
generate_for: ['web/**.dart']
options:
dart2js_args:
- --no-source-maps
- -O4
- --fast-startup
- --minify
- --trust-primitives
- --trust-type-annotations
複製代碼
# pubspec.yaml
name: flutter_go
description: flutter_go
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: any
build_web_compilers: any
build_daemon: any
# dependency_overrides 優先直接引用github上的packages
dependency_overrides:
flutter_web:
git:
url: https://github.com/flutter/flutter_web
path: packages/flutter_web
flutter_web_test:
git:
url: https://github.com/flutter/flutter_web
path: packages/flutter_web_test
flutter_web_ui:
git:
url: https://github.com/flutter/flutter_web
path: packages/flutter_web_ui
複製代碼
固然
dependency_overrides
你也能夠配置成本地路徑,可是爲了保證依賴庫的最新,仍是用git上的比較好, 下面是本地路徑的配置。
dependency_overrides:
flutter_web:
path: ./packages/flutter_web
flutter_web_test:
path: ./packages/flutter_web_test
flutter_web_ui:
path: ./packages/flutter_web_ui
複製代碼
packages
包$ flutter pub upgrade
! flutter_web 0.0.0 from path packages/flutter_web
! flutter_web_ui 0.0.0 from path packages/flutter_web_ui
Running "flutter pub upgrade" in hello_world... 5.0s
複製代碼
Flutter-go
項目下的 libs 到Flutter_go_web
目錄下webdev
構建並啓動開發服務器$ webdev serve
或者 webdev 與熱重載一塊兒使用
$ webdev serve --auto restart
複製代碼
[INFO] Reading cached asset graph completed, took 598ms
[INFO] Checking for updates since last build completed, took 2.1s
[INFO] Starting resource servers...
複製代碼
以後提示一直在鏈接中, 說明 缺乏
resource
資源文件,繼續下面操做
web
入口手動建立
web
文件夾,裏面建立兩個文件:index.html
爲入口html
頁面main.dart
爲html
引用文件
<!-- 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> 複製代碼
/// main.dart
import 'package:flutter_web_ui/ui.dart' as ui;
/// flutter_go 是項目名稱,在pubspec.yaml 裏已經設置
import 'package:flutter_go/main.dart' as app;
main() async {
await ui.webOnlyInitializePlatform();
app.main();
}
複製代碼
文件目錄結構基本已經成型,以下:
webdev
編譯並啓動開發服務器$ webdev serve --auto restart
複製代碼
本地服務器這樣就能跑起來了!?先別忙,接下來報了以下一堆錯誤 ...
package:flutter/material.dart -> package:flutter_web/material.dart
package:flutter/widgets.dart -> package:flutter_web/widgets.dart
package:flutter/cupertino.dart -> package:flutter_web/cupertino.dart
package:flutter/services.dart -> package:flutter_web/services.dart
package:flutter/rendering.dart -> package:flutter_web/rendering.dart
package:flutter/gestures.dart -> package:flutter_web/gestures.dart
dart:ui -> package:flutter_web_ui/ui.dart
複製代碼
你能夠一個個文件替換,不過筆者寫了一個轉換庫
trans2fw
小工具,用一個命令就能夠對【官方經常使用的代碼庫】轉換成web版本,減小你們的開發成本。 trans2fw 是筆者開發的一個 自動化 flutter native 項目轉化成 flutter-web 項目的工具,已經提交到pub
鏡像上。github 地址>>>
trans2fw
工具, 並註冊程序$ pub global activate trans2fw
$ pub global run trans2fw
複製代碼
trans2fw
工具,根據提示輸入,安裝完成後,基本按提示輸入轉換目錄就能夠了$ trans2fw
[✓] 請輸入須要轉換的文件目錄(相對於項目目錄): lib
[✓] 是否覆蓋原有文件 ? (y/N) y
{path: lib, cover: true}
使用輸入文件目錄:lib
被轉換的文件::lib/routers/application.dart::4
被轉換的文件::lib/routers/routers.dart::4
被轉換的文件::lib/routers/router_handler.dart::4
被轉換的文件::lib/resources/icon_names.dart::3
被轉換的文件::lib/resources/shared_preferences_keys.dart::3
被轉換的文件::lib/resources/widget_name_to_icon.dart::3
被轉換的文件::lib/standard_pages/index.dart::6
...
複製代碼
稍等片刻 ... 見證奇蹟
webdev
編譯並啓動開發服務器$ webdev serve --auto restart
複製代碼
what c... is your problem ?! 還有這麼多... 彆着急再仔細看,剩下的都是第三方庫的依賴問題! 若是你本身的項目沒有過大量的第三方庫,也許已經運行起來了。 沒關係,我們逐個解決。
總結一下都有哪些第三方庫須要搞定:
真的好多,怎麼辦,
Google 大法
留的坑,目前只能自力更生了。 寫到這裏一看 iwatch ⌚️,已經凌晨了,一聲感嘆 "哎我去" ... 篇幅有限,這些個問題我會在《從 Flutter Go 到 Flutter Go web - 手把手帶你輕鬆玩轉 Flutter-web(二)》作解答,若有興趣想知道我如何解決的,敬請繼續關注。
沉澱了數月,FlutterGo 終於迎來了第二次迭代更新!不只新增我的中心的概念,還提供了第三方共建工具、而且,咱們還完成了 FlutterGo web 版的開發。而這些~都在咱們FlutterGo官網可見!!!
Flutter Go 2.0
即將發佈Flutter Go 2.0 秉承年初發布的 The Flutter-Go Roadmap(路線圖) for 2019 已經作了新版本的迭代,新版本以下新功能:
Flutter Go
官方網站 (官方消息,發佈,學習)
Flutter Go web
版本 (web 版本學習幫助)
用戶中心 (專屬我的的widget
案例)
GitHub
帳戶)Flutter
資訊)ISSUES
)Flutter Go
的 pull request
工具Flutter Go Widget
標準公共模版markdown
模版動態化生成(合併到master分支後) Flutter Go
官方 APP
版本自動升級
因爲 flutter 內容更新較快. 咱們沒法更快的豐富項目的內容. 若是您願意爲國內flutter的發展與學習貢獻本身的力量, 請參考咱們的 共建說明, 咱們會將共建者的頭像姓名貢獻至咱們的官網.
此處再次感謝全部已經提交 pr 的小夥伴
![]()
FlutterGo 期待你我共建~
具體 pr 細節和流程可參看 FlutterGo README 或 直接釘釘掃碼入羣