Flutter全平臺!遷移現有Flutter項目到WEB端

寫在前面

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項目到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.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

運行項目,能夠發現和移動端基本沒有區別。

效果仍是蠻流暢的🤙。

若是你想查看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…

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

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

若是你想了解更多關於MVVM、Flutter、響應式編程方面的知識,歡迎關注我。

你能夠在如下地方找到我:

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

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

Github: github.com/ditclear

相關文章
相關標籤/搜索