Flutter 1.0 正式版: Google 的便攜 UI 工具包?

mp.weixin.qq.com圖標

北京時間2018年12月5日凌晨,Google Flutter 團隊發布 Flutter 1.0 正式版。


超全面回答,多圖預警

————————————————————

Flutter1.0發布,雖然已經期待已久,但看到1.0的出現,依然驚艷不少。最大的就是Flutter in Web,即Hummingbird的實現,雖然依然只是原型,但用Flutter來統一整個大前端前景可期。

分幾個方面說下感受吧:

Flutter Framework設計

聲明式+響應式的開發模式

開發者無需過多地關注自己Widget布局的優化,框架本身會去計算哪些Element需要去Build,Layout和Paint。換句話說,框架本身保證了即便應用開發者不做很多優化便可以實現較好的性能。

組合性的API

提供了靈活而強大的API。當然對於很多Native背景的開發者而言,這種嵌套式的寫法,還是需要時間和成本去習慣的。

原生的擴展

Channel使得開發者可以輕易用於Native的功能擴展,而且是Native體驗。

跨平台能力

Flutter最大優勢,即架構於Skia之上的較徹底的跨平台能力。

Skia Graphics Library

Skia is an open source 2D graphics library which provides common APIs that work across a variety of hardware and software platforms. It serves as the graphics engine for Google Chrome and Chrome OS, Android, Mozilla Firefox and Firefox OS, and many other products.

Platforms
Windows 7, 8, 8.1, 10
macOS 10.10.5 or later
iOS 8 or later
Android 4.1 (JellyBean) or later
Ubuntu 14.04+, Debian 8+, openSUSE 13.3+, or Fedora Linux 24+

貼下Flutter的設計架構:

通過與Skia的深度合作與優化,Flutter可以最大限度地抹平平台差異,提高渲染效率與性能。

移動端(iOS/Android)

從下面的圖示可以看出,其實Flutter就是自己寫了一套替代原生的應用開發框架。

這也從原理上解釋了,為什麼Flutter能達到和原生一樣的流暢度等。

當然,相對於iOS/Android原生App開發中應用代碼無需內置UIKit等系統庫,Flutter因為要自帶針對自己定製和優化過的Skia(以及其他engine部分),那麼引入帶來的包大小會是個問題。

此外,WWDC2018上,OpenGL ES已被宣告Deprecated,而Skia目前的渲染後端還沒有完整的Metal的實現 但好消息是,Skia已經開始開發Metal後端,相信在不遠的將來,使用Flutter開發的iOS應用也可以享受到Metal的高性能。

Flutter的開發邏輯類似用遊戲引擎的方式來寫App,用它來開發2D遊戲當然也是可行的。

譬如SpriteWidget

說到2D,可能有人會問3D怎麼辦?其實Flutter和Skia的設計並未限制2D,後續如果有明確的需求場景和資源,相信也是可以期待的。

桌面

Flutter的設計已經隔離了跨平台部分和平台相關部分,只有Embedder層是平台相關的。Embedder主要用來設置線程消息循環隊列,創建用於渲染的Surface,平台相關內容的插件與通信,資源打包等。

桌面應用只需要實現這些內容即可,Engine本身已提供Embedder API,開發者分平台實現即可。

Embedder API

目前已有谷歌維護(但非官方支持)的項目進行中:

Flutter Desktop Embedding

如下所示:

Web

Dart語言最早就是抱著取代JavaScript的初衷出現的,只是鑒於js生態(代碼庫,多平台上的調試與優化等)的龐大和難以替代。Dart最終於2015年放棄了將VM置入Chrome,轉而專註於Dart2JS的方式。

從原理上看,如果想讓Flutter在Web上運行,那麼面臨的問題主要包括:

1.dart語言層面在Web執行

這一點其實dart2js已經演進多年,方案就是dart2js在瀏覽器運行。

2.Flutter的實現下,基於flutter-&>dart:ui-&>engine-&>skia實現渲染。要使其可以在web中運行,就要將dart:ui中對於engine的native方法調用替換成對於dart for web庫的引用即可。

即從

到:

說起來簡單,做起來卻是另一回事了,但牛逼如谷歌,參見Hummingbird: Building Flutter for the Web

簡單來說,方案分兩條路:

個人更傾向於HTML+CSS+Canvas,畢竟兼容性好,期待後續有持續優化,使這部分儘早達到產品開發的標準。

Dart語言

雖然Dart在谷歌內部應用很多,但Flutter選擇Dart也是有一定的偶然性。

Why Dart? Answer by Hixie From Flutter

從另外的角度看,Dart的很多特點也使得其對於Flutter不可或缺。

a. 支持AOT編譯,使得Release模式下可以編譯快速,可預測的,Native代碼。

b. JIT編譯,開發階段變更迅速生效,hot reload。

c. 對於開發者,容易上手和學習。

Why Flutter Uses Dart

Hot Reload

像P圖一樣寫代碼,實現App開發。

反射的問題

Flutter的反射比較弱,只能用來做一些Introspect和Invoke,目前不具備Objective-C那麼強的動態能力。
據我們了解,Flutter禁止反射最重要的原因不是因為包大小,而是為了代碼的可預測性。實際上即便打開mirror支持,tree-shaking的邏輯也是work的。
目前我們對於json&model這種採用的還是代碼生成的方式。

其他挑戰

對於外界而言,Dart還是一個很新的東西,而且文檔缺乏。有的東西是確實沒實現,比如語言級別的動態修改對象的內存結構等;有的東西是實現了,但是使用起來沒那麼順手,文檔也比較缺乏,如Observatory;有的則是內部已經有實現,但是沒有好的Get Started例子可以讓外部的開發者去自定義,如類似AspectJ的東西,等等。

技術選型Flutter考慮點

包大小問題

基於Flutter1.0構建一個最簡單的hello_flutter為例:Release模式下iOS ipa大小為9.7MB(armv7和arm64雙架構),Android apk大小為5MB(armeabi-v7a)。

Flutter的包大小主要來自於兩部分,一部分是一次性引入帶來的包大小,這裡主要是Engine部分,也就是我們所看到的Flutter.framework(iOS)和libflutter.so(Android)。那麼Flutter的Framework為什麼這麼大呢?因為內容太多了,以iOS為例(之前版本的一個分析,僅做比例參考):

Android的情況類似,Skia等是植入engine的,而不是復用Android自帶的內容。原因在於Flutter使用的Skia是最新的同步演進的Skia,而不是引用Android發布的老的Skia。

除了一次性引入的成本外,新業務的演進過程中,dart生成的機器代碼也要注意包大小的問題,以免因為大量重複代碼(如json&model轉化這種)導致包大小較快膨脹。這一部分可以參考我們的一些工作: Flutter瘦身大作戰

熱更新的問題

目前的AOT的編譯模式下,Android比較容易實現熱更新,原理參見:https://mp.weixin.qq.com/s/vlHt8jxbdzBqJZDobpsFVw

至於iOS的實現,最大的問題不是技術上如何實現,而是如何做才能遵守審核規則而不帶來審核風險。

穩定性

從我們的經驗來看,Flutter在雙端的穩定性(Native Crash)在0.01%這樣的量級,都是Engine內部C++的崩潰。

性能

Native級別的性能

混合的場景

這個也要看粒度,分幾個層面來看: a. 工程的維度 參見閑魚等團隊的混合工程實踐,主要是包名修改,目錄結構和打包的問題。 b. 頁面的維度 這種維度能夠比較好地解決常見的已有Native工程的重構,而且混合頁面(棧)方案比較成熟。具體可以參見閑魚的方案。 c. 一個Native嵌入多個Flutter Card 目前沒有現成的好用的封裝邏輯,多個Flutter實例會帶來過度的內存使用等開銷,數據的通信與共享也因為Isolate的隔離變得複雜。 d. 一個Flutter頁面嵌入多個Native View Flutter在1.0版本中加入了對於此部分的支持,但還是有一些問題,比如Android上的API Level要求20等。

Flutter直接調用C++

原理上可行,因為Dart本身就可以這麼做;實際的支持要看場景和需求。

分包的問題

考慮到tree-shaking的設計,目前的多包還是通過源代碼的方式集成。

新的知識體系+工具鏈

Flutter設計確實很贊,儘可能地抽取出了最小的平台相關性,將儘可能多的邏輯實現變得平台無關,最大程度上實現了Write One, Run Everywhere。但畢竟有的內容是無法繞開原生系統(Embedder)的,比如說鍵盤,輸入框等,而這些部分在開發過程中也往往是痛點。 此外,Flutter其實是一個系統的內容,知識面和工具鏈包括但不限於以下部分: a. Dart pub用來管理Dart依賴 Dart Remote Debugger用來調試Dart代碼 Observatory可用於同VM通信,實現調試,Profile,內存對象監控等。

b. Flutter 組合式的API,對於Native背景的開發者書寫UI還需要學習適應 Flutter Widget Inspector查看View層次。 PerformanceOverlay查看實時渲染幀率等 Flutter開關+Observatory查看CPU渲染性能瓶頸 SkDebugger查看GPU渲染性能瓶頸

c. engine代碼獲取與構建 gclient管理代碼依賴 ninja管理構建 flutter_gdb用於調試Android Engine; lldb用來調試iOS Engine。

如何深入Flutter

嘗試著回答這一點,因為有些體感。 如果我們只關註上面的Flutter框架(Dart)的使用,那麼就同掌握一個UIKit一樣,API熟悉,語言會用就好了。但如果要能夠比較快速地定位和發現問題,實現各種需求,那麼要求會高不少。 簡而言之就是要了解OpenGL ES相關的知識,尤其是Native(包括拍照等)與Flutter混合的時候;了解Dart的各種不為人知的內容,尤其是當你需要的東西缺合適的輪子的時候;要了解iOS/Android,畢竟你的應用是運行在Native的App中的,很多東西都離不開Native;要了解ninja的構建系統,尤其是當你需要去自定義一些編譯屬性,實現對Dart/Skia/Engine等的自定義處理;要了解lldbgdb,尤其是當你需要觀察和理解其內部原理的時候;要了解flutter tools的工作原理,以便實現自定義的構建過程的時候;etc。

寫在最後

閑魚團隊作為國內最早(國際上也特別早期)使用Flutter在大型項目中開發業務的團隊,從alpha-&>beta-&>1.0,我們遇到了不少問題,也解決和推動Flutter完善了許多,尤其是Add2ExistingApp等內容。總的來看,Flutter是很適合做跨平台應用開發的,不管是全新應用還是重構已有的應用。 Flutter1.0是一個重要的里程碑,更是一個嶄新的開始。雖然後面還會有不少的問題和困難,不管是輪子不夠多,還是插件不夠完善,但這條路是最貼近原生開發體驗和性能表現的跨平台應用開發方案,期待和歡迎社區對Flutter感興趣的同學和團隊更多地接觸,使用和反饋Flutter,讓這一切期待中的美好早日實現。


CSDN作者郭芮

「Flutter 的核心是一個獨立的可執行二進位文件,所以它不僅能改變移動開發的世界,也能改變桌面開發的世界。你只需編寫一次代碼,就可以在 Android、iOS、Windows、Mac 和 Linux 上以原生方式發布,還能通過 AngularDart 與 Web 共享業務邏輯——這一點意義重大。"

Google 官方今日宣布,Flutter 的 1.0 版本正式發布了!

在去年的 Google I/O 大會上,Flutter 首次出現在公眾面前,彼時的 Google 表示,這是「一款新的用於創建移動應用的開源庫」,並且「Flutter 將會幫你更容易,更快速地開發出界面美觀的移動應用。」但是在此之後,業界一直持觀望態度,Google 也似乎偃旗息鼓,不再折騰。

直到今年 2 月,Flutter 推出第一個 Beta 版本,很快便憑藉強大的跨平台 UI 框架得到了開發者們的熱烈響應,成百上千款基於 Flutter 開發的應用在 Apple Store 和 Google Play 上湧現。在今年 9 月的 Google 開發者大會上,Flutter Release Preview 2 正式公測,並宣布「這是正式版之前的最後一個預覽版」。而現在,Flutter 1.0 版本終於正式發布了。

「全新的 UI 設計方式」Flutter

一般而言,移動開發者們在同時兼容 iOS 和 Android 時會選擇走原生開發路線,把界面和邏輯在不同平台分別實現,但這往往面臨著複雜龐大的工作量、難以為繼的運營維護。因此,也有很多開發者選擇用同一套代碼兼容多個平台,但這樣往往會導致運行速度和產品保真度的損失。

正是在這種情況下,Google 向外推出了 Flutter 「這一全新的 UI 設計方式」,還表示能夠為開發者提供了兩全其美的解決方案——既能用原生 ARM 代碼直接調用的方式來加速圖形渲染和 UI 繪製,又能同時運行在 Android 和 iOS 兩大主流移動操作系統上。

根據 Google 的官方博客介紹,Flutter 是應用內置的一個引擎,具有快速、高效、開放等特點。

1、Flutter 可以構建界面精美的應用

Flutter 具有強大的圖像組合能力,開發者可以不受限制地堆疊任何圖形、視頻、文本和控制項。Flutter 內置了一系列的 widgets,這些 widgets 可以幫助實現在 iOS 和 Android 上的良好視覺體驗。Flutter 集成並有最大程度地實現了 Material Design——這是 Google 的開放設計系統。

2、Flutter 的速度快

Flutter 基於 Skia 2D 硬體加速圖形引擎,有媲美原生應用的速度。Flutter 的代碼基於 Dart 平台,可以被編譯成 iOS 和 Android 平台上 32 位和 64 位的 ARM 代碼。

3、Flutter 非常高效

Flutter 引入了 Stateful Hot Reload(保持應用狀態的熱重載),這個新特性可以讓移動開發者和設計師們實時迭代應用程序。通過 Stateful Hot Reload,無需重新啟動應用就可以在程序運行的時候直接看到代碼修改之後的效果,Stateful Hot Reload 改變了開發者們編寫應用的方式。據 Google 用戶反饋,開發者們表示該特性使得開發效率提升了三倍。

4、Flutter 是開放的

Flutter 是一個開源項目,全球數百位開發者在為其貢獻代碼。Flutter 的插件生態系統平台也充滿活力,有數千款插件已經發布,避免了重複造輪子。由於 Flutter 應用程序使用標準的 Android 和 iOS 的編譯打包工具 (build tools),因此它的開放還體現在您可以使用原生開發資源。

目前在 Google 內部,Flutter 已經被廣泛用於多個產品,比如 Google Ads 已經將其產品的 iOS 版本和 Android 版本轉向使用 Flutter。而且據 Google 官方透露,在正式版本之前全世界已經有多個公司開始使用 Flutter 來開發應用,包括 Abbey Road Studios、阿里巴巴、Capital One、Groupon、Hamilton、京東、Philips Hue、Reflectly 以及騰訊等。

Flutter 1.0 新特性

此次發布的Flutter 1.0 版本中,Flutter 正式開始使用 Dart 平台新的 2.1 版本,並修復了 Bug 和提高了穩定性。根據 Google 介紹,1.0 版本中將有兩個新功能隨正式版的預覽模式提供給廣大開發者,包括引入 Flutter 到現有工程(Add to App)和平台級視圖(Platform Views)。

1、引入 Flutter 到現有工程 (Add to App)

起初在構思 Flutter 的時候,Google 主要關注於從零開始構建應用的場景。但事實上受制於很多因素,並不是所有開發者都能從零構建。顯然,他們更需要能夠在現有的應用中用 Flutter 添加新的功能,或者分步驟、分階段將現有的應用程序遷移到 Flutter。

現在,Flutter 的架構則非常適合於這樣的場景,每個 Flutter 應用都包含了一個用於託管 Flutter 的 Android 或 iOS 容器。此外,Google 還在不斷改善漸進式接入 Flutter 的體驗,包括更新模板、優化工具、完善指南等等,還能在不使用調試器啟動應用的情況下介入和監測現有 Flutter 進程。

2、平台級視圖(Platform Views)

此外,為了滿足開發者將 Android 或 iPhone 平台的控制項嵌入到 Flutter 應用當中的需求,Flutter 中還引入了 AndroidView 和 UiKitView 這兩個平台級視圖的 widget 到 Flutter,可以將它們分別嵌入到指定的平台中。

Google表示其已經在 Android 平台上預覽這一功能數月了,現在是時候將這一特性推廣到 iOS 平台了。此外,像 Google Maps 和 WebView 這樣的插件也已經可以享受到這一特性帶來的種種便利了。

據了解,這些功能將於明年二月的季度更新中正式推出。

Flutter 項目應用端的拓展和實踐

此外,Google 方面也透露,雖然 Flutter 的首要目標平台是 iOS 和 Android,但他們也在不斷探索將 Flutter 拓展到手機端以外的更多平台上,Flutter Desktop Embedding 就是其中的一個。

Flutter Desktop Embedding 是一個使 Flutter 運行於 macOS、Linux 和 Windows 等桌面操作系統的項目。這是 Google 以探索的形式向用戶展示 Flutter 是有可能運行在一些沒有完整桌面環境的小型設備中的。

顯然,有這一想法的不只是Google。在 Android 開發者 Norbert Kozsir 的博客中,就介紹了一個由他和 Simon Lightfoot 創立的 Flutter 桌面應用項目,其不僅可以開發真正的應用程序,也能用於快速移動開發。

以下是其博客內容全文:

Flutter 的核心是一個獨立的可執行二進位文件,所以它不僅能改變移動開發的世界,也能改變桌面開發的世界。你只需編寫一次代碼,就可以在 Android、iOS、Windows、Mac 和 Linux 上以原生方式發布,還能通過 AngularDart 與 Web 共享業務邏輯——這一點意義重大。

我們先來看看它的基本思想。

原生桌面客戶端,加速移動開發

但在討論實際的原生桌面應用之前,我們先來看看Flutter桌面版能為移動開發者帶來什麼。

啟動時間

在討論任何生產力話題之前,有兩件不可忽略的事情:一是 Android 模擬器的啟動時間,二是 Gradle 的運行時間。

下面的 Gif 中我錄製了我自己啟動模擬器和運行默認的 Flutter 應用花費的時間,總共花了我 2 分 40 秒(想像一下這段時間能做多少事情)。

Android啟動時間和運行Gradle的時間(10倍速)

如果我告訴你,這一切只需不到10秒,你會怎麼想?原生方式運行應用,可以跳過在系統上運行Android和運行Gradle的所有額外開銷。

再看看這個:

Flutter模擬器啟動,原速

注意你都不需要離開IntelliJ,我們把所有運行Flutter所需的工具都做成了原生應用,能在所有支持Flutter的IDE中使用。

運行時可改變大小

不論是什麼應用,你都想測試它在不同屏幕大小下的表現。該怎麼做呢?

一種方式是跟朋友借一大堆不同尺寸的手機,或者建一大堆各種尺寸的模擬器,以確保應用布局在任何設備上都正常顯示。但這看起來太麻煩了。

還有更好的辦法嗎?有!

這張圖應該能說明一切問題

訪問電腦上的資源

在開發和測試應用時,如果應用需要訪問手機上的資源,那就需要先把所有測試用的文件都傳送到模擬器上或設備上,這一步非常麻煩。如果能直接用操作系統的原生文件選擇對話框來選擇文件該有多好。

沒錯,這個也能做到!

桌面版支持文件選擇對話框

這個功能最大的好處在於桌面版的實現使用了與移動版的實現相同的通道,因此不需要改變任何代碼。

熱重載和調試

這個功能看上去像是錦上添花,但對於每個高效的工程師來說,熱重載和調試功能都是必不可少的。所以桌面版中也支持了這一功能!

原生應用中的熱重載和調試功能

內存

最後很重要的一項就是內存,對於在筆記本電腦上或開發機器配置不高的人來說這一點很重要。

Android模擬器會吃掉大約1GB內存,想像一下如果運行兩個模擬器(比如測試聊天應用等),再加上IntelliJ和非常吃內存的Chrome,可以想像電腦會有多慢。

Android模擬器佔用了1GB內存

由於Flutter的嵌入器是原生的,因此不需要Android。這樣一來它就非常小了。

原生應用只需要100MB內存

原生桌面應用

只是在桌面上運行Flutter應用還不能算是完整的、能用於產品的桌面應用。如果只是這樣,那感覺像是在桌面上運行移動應用。那麼還差什麼?滑鼠懸停,游標改變,滾輪交互等等,所以項目中也加入了對這些功能的支持。

項目成功地實現了這些功能,而沒有改動任何平台代碼。所以,它是完全獨立的包,可以包含在任何普通的 Flutter 應用中。但是,跟桌面嵌入器一起使用,就會出現奇蹟。

用Flutter實現的通用聊天應用,桌面版

這跟在Android模擬器上運行的代碼是完全一樣的:

同時開發Android和桌面應用

注意它在模擬器上表現得與普通應用一樣,但在桌面上就會改變游標,並添加滑鼠懸停效果。

桌面小窗體的展示

懸停:

游標:

目前這個項目依然在 alpha 階段,相關代碼很快就發布了(感興趣的可以在 Twitter 上關注 Simon Lightfoot 以獲得最新的消息)。總而言之,這個項目的目標是在不遠的未來發布一種易於安裝、易於設置、易於使用的東西。

參考鏈接:

  • https://mp.weixin.qq.com/s/hCIN42OMmmc6HkOveegwWQ
  • https://medium.com/flutter-community/flutter-on-desktop-a-real-competitor-to-electron-4f049ea6b061,譯者彎月。


看看來自於官方的報道吧!

谷歌的野心,Flutter 的能力!不止步於移動平台哦,這個跨平台的能力有點強大哦!

前有 Flutter ,用的語言是 Dart,後有 Go ,谷歌是想一統天下平台啊!通吃的節奏!

目前有谷歌背書,只要步子走的穩,生態起來並成熟,還是很有希望的。新技術的建立和起來,與其他成熟語言技術相比,差就差在生態上。

從目前的情況和節奏來看,這次 Google 是認真的,也是在為它的下一代操作系統 Fuchsia 提前鋪路啊!所以,如果想學的同學,可以平時提前學學了。

Flutter 1.0 正式版: Google 的便攜 UI 工具包?

mp.weixin.qq.com圖標

現在最大的問題其實不是界面的問題,而是底層能力還不足以支撐所有的業務能力。比如你要做一個掃碼器,做一個相機,做一個多媒體播放器,做一個Proxy,做一個讀寫NFC的功能,做一個LBS相關的產品等等等等,都需要有Native相關的人來給你做一個可以獲取底層能力的介面,Flutter並沒有徹底打通生態所必需的所有東西,開發體驗就像是半吊子的Hybrid App,讓人比較難接受。

我依然看好Flutter,不代表我現在就要喜歡它現在就要去用它。你可以先學。


作為移動開發者,非常關注 Flutter,熬夜看了這場所謂的『Flutter 歡慶 Live』,還是挺值得的。

首先說沒有料到這個 Live 上會發布 Flutter1.0 正式版,這意味著 Flutter 經過幾年的發展,到今天已經相對之前比較穩定成熟了,這是個裡程碑,儘管以後的路還長。

最大的驚喜是,Google 真的野心不小,到今天我們才知道,Flutter 的發展藍圖不僅僅局限於Android、iOS,而是把目光放在了全端,Mac、Windows、Web(關鍵詞:Hummingbird,Google 還是沒有放棄 Dart 在 Web 上的應用,這個實驗項目將 Dart 編譯為 Javascript),甚至樹莓派。Flutter 的開發語言是 Dart,了解過 Dart 的朋友應該知道,Dart 從最早對標 Javascript 失敗以後,便被 Google 定位於『應用編程語言』,是相對於 Golang 的,但是一直沒有啥動靜,甚至 Android 的官方開發語言都選擇了別人家的孩子 Kotlin,不管之前怎麼樣,但是這一次看來 Google 準備借 Flutter 之勢把 Dart 語言的應用編程的地位給鞏固,作為兩個親兒子語言,Go 去做服務端了,前端、客戶端的戰略部署任務就直接交給 Dart 來配合 Flutter 框架了,這麼想來也是沒有任何毛病,值得一提的是,這一次 Live 中,Dart 也升級到了 2.1 版本。

另外,我們知道 Flutter 是 Fuchsia OS 的指定開發框架,不知道 Fuchsia OS 到時候會給我們帶來怎樣的驚喜。總而言之,Flutter 作為一個新框架剛一登場就展現了他的優秀,無論從設計理念,從實際構造,從性能指標,都算優秀,同時開發團隊也為 Flutter 描繪了一個 Google 風格的宏偉藍圖,最主要的是給我們開發者以及消費者畫了個大餅,但是作為一個 Google 的項目究竟能發展得如何還有待進一步觀察,懂的人自然懂(打個廣告:50大洋收Google 眼鏡做收藏用,不議價),畢竟 Flutter 還有很多可以改進的空間(4000+issue要解決......),很期待 Flutter 能發展的像他們在這場 Live 中規劃的一樣好,無論如何,1.0版本的發布,之前觀望的開發者們其實可以開始學習了,Flutter 的學習成本並不是特別高,尤其是 Java 過渡到 Dart,還算平順。

突然想起來,還是要強調一點,Flutter 不能直接稱為跨平台開發框架,而只是跨平台UI開發框架,so,目前想要實現 All in Flutter 還是挺困難的,我們需要輪子。

Flutter 桌面端開發框架項目?

github.com圖標

Flutter Web端項目 — Hummingbird

google 牛逼。


推薦閱讀:
相关文章