從 Flutter Go 到 Flutter Go web - 手把手帶你輕鬆玩轉 Flutter-web(一)

背景

其實背景很少說, Flutter for WebGoogle大會 伴隨 Flutter 發佈了1.5.4版本推出了Flutter for Web的預覽版。javascript

從5月後到目前(9月)業內對於 Flutter for Web 的觀點,也是喜憂參半。html

目前官方自述的問題包括一下內容:前端

  • Flutter for Web 尚未插件系統。暫時提供訪問dart:html,dart:js,dart:svg,dart:indexed_db,只能使用其餘網絡庫訪問的瀏覽器的API
  • Flutter for Web 不能實現Flutter全部的 Api
  • Flutter for web 生成的代碼可能運行緩慢,或者顯示重要的UI jank
  • 目前,桌面用戶界面的互動並不齊全,所以 flutter_web 在PC瀏覽器上運行,運行的用戶界面像手機APP同樣
  • 開發工做流程目前僅適用於Chrome( 筆者的 Safari 瀏覽器(版本 12.1.1)運行正常)

儘管 Flutter for Web 還有這樣或者那樣的問題,可是還好他只是 預覽版, 將來可期,畢竟 Google 仍是有無限可能。 同時筆者經過一些渠道瞭解到,Flutter for Web 年末還有大動做。java

下面是 Flutter 官方的2019年,是「 Google的一個早期採用者計劃 」,其中提到: 「 優秀的候選人將參與到引人注目的場景中,計劃在2019年末將有一個基於 Flutter web 的體驗發佈 」。webpack

進入正題,給我一個beats,讓我先 freestyle 一下 !

前言

筆者所在的團隊以前開發了 FLutter Go 這個「 幫助 FLutter 開發者快速上手的 APP 」,受到了一些 Flutter 入門開發者的承認。若是不瞭解這個項目請移步到 這裏git

FLutter Go 遇到Flutter for Web ,如同牛奶遇到咖啡,咱們必須作點什麼.github

  • 第一:親歷Flutter for Web 到底如何;
  • 第二:爲須要從Flutter nativeFlutter-web 的開發者,摸石頭趟條路,畢竟從nativeweb,並非一鍵生成的,還有許多坑要填。

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 有一個基本的瞭解。若是熟悉請忽略。

構建環境

1. 安裝 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"
複製代碼

2. 拉取 flutter_web 示例

Flutter-web版本都是基於,web版本的 packages 包,因此要另起一個新的工程。 爲了不建立的不一致性,基於官方的 flutter_web 示例作更改

$ git clone https://github.com/flutter/flutter_web.git flutter_go_web
複製代碼

3. 建立 flutter_go_web 項目

因爲咱們只有一個目標項目,因此能夠刪除 examples 目錄,替換成 Flutter Go項目開發。

$ cd flutter_go_web
$ rm -rf examples
複製代碼

4. 手動建立 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
複製代碼

5. 更新 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
複製代碼

6. 拷貝 Flutter-go 項目下的 libs 到Flutter_go_web 目錄下

7. 如今就可使用 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 資源文件,繼續下面操做

8. 建立 web 入口

手動建立 web 文件夾,裏面建立兩個文件: index.html 爲入口 html 頁面 main.darthtml 引用文件

<!-- 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();
}
複製代碼

文件目錄結構基本已經成型,以下:

9. 再次運行 webdev 編譯並啓動開發服務器

$ webdev serve --auto restart
複製代碼

本地服務器這樣就能跑起來了!?先別忙,接下來報了以下一堆錯誤 ...

> 基本是依賴的 `Flutter-web`的核心庫和第三方庫,核心庫須要替換的依賴大概以下:
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
...
複製代碼

稍等片刻 ... 見證奇蹟

10. 再次運行 webdev 編譯並啓動開發服務器

$ webdev serve --auto restart
複製代碼

what c... is your problem ?! 還有這麼多... 彆着急再仔細看,剩下的都是第三方庫的依賴問題! 若是你本身的項目沒有過大量的第三方庫,也許已經運行起來了。 沒關係,我們逐個解決。

解決第三方庫

總結一下都有哪些第三方庫須要搞定:

  • fluro
  • flutter_jpush
  • flutter_spinkit
  • event_bus
  • share
  • shared_preferences
  • zefyr
  • image_picker
  • sqflite
  • url_launcher
  • flutter/foundation
  • flutter_webview_plugin
  • flutter_bloc
  • bloc
  • dio
  • city_pickers
  • markdown
  • path_provider
  • cookie_jar
  • sqflite

真的好多,怎麼辦,Google 大法 留的坑,目前只能自力更生了。 寫到這裏一看 iwatch ⌚️,已經凌晨了,一聲感嘆 "哎我去" ... 篇幅有限,這些個問題我會在《從 Flutter Go 到 Flutter Go web - 手把手帶你輕鬆玩轉 Flutter-web(二)》作解答,若有興趣想知道我如何解決的,敬請繼續關注。

以上的案例的github地址>>>

最後

沉澱了數月,FlutterGo 終於迎來了第二次迭代更新!不只新增我的中心的概念,還提供了第三方共建工具、而且,咱們還完成了 FlutterGo web 版的開發。而這些~都在咱們FlutterGo官網可見!!!

相關介紹

🔥 Flutter Go 2.0 即將發佈

Flutter Go 2.0 秉承年初發布的 The Flutter-Go Roadmap(路線圖) for 2019 已經作了新版本的迭代,新版本以下新功能:

注:✔是本次發佈內容

三方共建說明

因爲 flutter 內容更新較快. 咱們沒法更快的豐富項目的內容. 若是您願意爲國內flutter的發展與學習貢獻本身的力量, 請參考咱們的 共建說明, 咱們會將共建者的頭像姓名貢獻至咱們的官網.

此處再次感謝全部已經提交 pr 的小夥伴

FlutterGo 期待你我共建~

具體 pr 細節和流程可參看 FlutterGo README 或 直接釘釘掃碼入羣

相關文章
相關標籤/搜索