Flutter全平臺!遷移現有Flutter專案到WEB端

ditclear發表於2019-06-02

寫在前面

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,效果圖如下:

Flutter全平臺!遷移現有Flutter專案到WEB端

怎麼做?

大多數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.htmlweb/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目錄會如下圖所示:

web

執行專案,可以發現和移動端基本沒有區別。

Flutter全平臺!遷移現有Flutter專案到WEB端

效果還是蠻流暢的?。

Flutter全平臺!遷移現有Flutter專案到WEB端

寫在最後

雖然說跨平臺的專案很多的,比如weex、RN、Kotlin等等,但是真正讓我體會到跨平臺高效一體的體驗還是Flutter,這也許就是為什麼年後我一直在學習和從事Flutter開發的原因之一了。

當然flutter_web還處於早期階段,一些flutter的功能還沒有完全移植過來,比如高斯模糊效果,而且我在safari瀏覽器裡開啟是一片空白,應該還沒支援safari瀏覽器,不過Flutter1.0正式版本才到來不久,相信在不久的將來,這些全都會有。

最後附上相關地址:github.com/flutter-ui-…,本文是為了方便檢視所以新開了一個倉庫,實際上只需要新開一個web分支就可以了。

參考文件

flutter_web:github.com/flutter/flu…

遷移指南:github.com/flutter/flu…

==================== 分割線 ======================

如果你想了解更多關於MVVM、Flutter、響應式程式設計方面的知識,歡迎關注我。

你可以在以下地方找到我:

簡書:www.jianshu.com/u/117f1cf0c…

掘金:juejin.im/user/582d60…

Github: github.com/ditclear

Flutter全平臺!遷移現有Flutter專案到WEB端

相關文章