Flutter是Google的移動UI框架,可以在iOS和Android上快速構建高質量的本地用戶界面。一個代碼可以同時生成兩個高性能、高保真的iOS和Android應用。Flutter的目標是讓開發者在不同的平臺上交付自然流暢的高性能應用,兼容滾動行為、排版、圖標等方面的差異。Flutter的開發語言是Dart。如果你用過Java或JavaScript等語言,你可以很快上手,甚至有些Flutter應用是沒有編程經驗的人寫的!世界上,Flutter被越來越多的開發者和組織使用,Flutter完全免費開源。
Flutter不同于其他大多數跨平臺框架,因為Flutter不使用網絡或操作系統的本地控制。相反,Flutter使用自己的高性能渲染引擎繪制widget。這不僅可以保證安卓和iOS上用戶界面的一致性,還可以避免依賴本地控制帶來的限制和高昂的維護成本。
使用Skia作為其2D渲染引擎的Flutter,Skia是一個2D繪圖引擎庫,它的前身是一個向量繪圖軟件,Chrome和Android都使用Skia作為繪圖引擎。Skia提供了非常友好的API,并且在圖形轉換,文本渲染,位圖渲染等方面都有友好高效的表現。Skia是跨平臺的,因此可以嵌入到Flutter的iOSDK中,而不需要研究iOS閉源的CoreGraphics/CoreAnimation。
現在Flutter默認支持iOS,Android,Fuchsia三個移動平臺(Google新的自主開發操作系統)。但是Flutter也可以支持Web開發和PC開發,這本書的例子和介紹主要是基于iOS和Android平臺,其他平臺的讀者可以自己了解。
開發高效毫秒級的熱負荷。修改后,您的應用界面將立即更新。使用豐富可定制的widget在幾分鐘內構建本地界面。
富有表現力和靈活的用戶界面快速發布專注于本地體驗的功能。分層結構允許您完全定制,從而實現難以置信的快速渲染和豐富的表現力和靈活的設計。
本機性能Flutter包含許多核心widget,例如滾動,導航,圖標和字體等等,這些都能在iOS和Android上實現本機應用程序的相同性能。
Flutter使用Dart作為開發框架和widget語言。
Flutter評估了四個主要維度,并考慮了框架作者、開發者和最終用戶的需求。我們發現不同的語言在不同的層面上滿足了一些要求,但是Dart在所有的評估維度上都得分很高,符合我們所有的要求和標準。
在Dart運行過程中,編譯器支持Flutter關鍵特征的組合:
基于JIT的快速開發周期:允許使用類型的語言改變形狀狀態的熱負荷
AOT編譯器可以生成高效的ARM代碼,可以快速啟動,具有可預測的生產部署性能。
另外,flutter開發團隊與Dart社區緊密合作,Dart社區正積極投入資源,以改善Dart在Flutter中的應用。舉例來說,當我們使用Dart時,這種語言并沒有提供工具鏈來生成本地二進制文件(這對實現可預測的高性能非常有幫助),但現在已經實現了,因為Dart團隊已經為Flutter構建了它。類似地,DartVM以前已經對吞吐量進行了優化,但是團隊現在正在優化VM的延遲時間,這對Flutter的工作負荷更為重要。
Flutter的主要價值主張之一是讓開發者使用相同的代碼庫為iOS和Android創建應用程序,從而節省工程資源。高效率的語言能進一步加快開發周期,使Flutter更具吸引力。它對于我們的framework團隊和開發者來說都很重要。大多數Flutter功能都是通過Dart實現的,所以我們需要在100,000行代碼時保持高效率,而不會犧牲framework和widget的可讀性。
雖然我們可以使用非面向對象的語言,但這意味著我們應該重新解決幾個問題。此外,大多數開發者都有面向對象開發的經驗,所以更容易學會如何使用Flutter進行開發。
可預測性和高性。借助于Flutter,我們希望開發人員能夠快速創建流暢的用戶體驗。為了實現這一目標,我們需要在每個動畫框架中運行大量代碼。這意味著我們需要一種語言,它不僅能提供高性能,還能提供可預測性能,而且不會導致丟幀的周期性暫停。
Flutter框架采用函數式流,它在很大程度上依賴于底層的內存分配器,因此有效地處理小的、短期的內存分配是非常重要的,因此Flutter不能在缺乏該功能的語言中有效地工作。
Flutter框架是一個分層結構,每一層都建立在前一層。
這個設計的目標是幫助你用更少的代碼做更多的事情。比如Material層是通過組合來自Widget層的基本Widget而構建的,Widgets層本身是通過低級物體渲染層構建的。
層為構建應用程序提供了許多選項。選擇一種定制的方法來釋放框架的所有表現力,或者使用構件層中的構建塊或混合匹配。您可以實現Flutter提供的所有現成widget,或者使用Flutter團隊用于構建框架的相同工具和技術來創建您自己的定制widget。
沒什么是隱藏的。您可以從高層次、統一的widget概念中獲得開發效率優勢,而不會犧牲您想要深入下層的能力。
Flutter框架分為三層Framework,Engine,Embedder。
FlutterFramework
Framework使用dart語言,包括UI、文字、圖片、按鈕等Widgets、渲染、動畫、手勢等。這部分的核心代碼是flutter倉庫下的flutterpackage,sky_engine倉庫下的io,async,ui(dart:ui庫提供Flutter框架和引擎之間的界面)等。
FlutterEngine
Engine使用C++實現,主要包括:Skia、Dart和Text。-Skia是一個開源的二維圖形庫,提供適合各種軟硬件平臺的通用API。作為GoogleChrome、ChromeOS、Android、MozillaFirefox、FirefoxOS等多種產品的圖形引擎,支持平臺,包括Windows、macOS、iOS、Android、Ubuntu等。-Dart部分主要包括:Dartruntime、GarbageCollection(GC),如果是Debug模式,也包括JIT(Justime)支持。在Release和Profile模式下,是AOTime編譯成原生的arm代碼,不存在于Debug模式,也不存在于后端。
Embedder
Embedder是通過這個層將Flutter嵌入到各個平臺中的嵌入層,Embedder的主要工作包括渲染Surface設置、線程設置、插件等。該平臺(例如iOS)只提供一個畫布,其余的所有渲染相關邏輯都在Flutter中,從而使其具有良好的跨端一致性。
總結
Flutter框架本身有很好的分層設計。本節旨在讓讀者對Flutter的整體框架有一個大致的印象。相信到目前為止,讀者已經對Flutter有了初步的印象。在我們正式開始之前,我們還需要了解Flutter的開發語言。
本節給你一些學習建議,分享作者在學習Flutter方面的一些經驗,希望能幫你提高學習效率,避免不必要的坑。
資源
網站:閱讀Flutter網站的資源是快速入門的最佳方式,同時網站也是了解Flutter最新發展動態的地方,由于Flutter目前仍處于快速發展階段,因此建議讀者還是不時地到網站查看是否有新動態。
源代碼和注釋:源代碼注釋應該是學習Flutter的第一文檔。FlutterSDK的源代碼是開源的,注釋非常詳細。有很多例子。其實Flutter官方SDK文檔是通過注釋生成的。源代碼和注釋可以幫你解決大部分問題。
Github:如果遇到的問題在StackOverflow上找不到答案,可以去githubflutter項目提issue。
Gallery源代碼:Gallery是Flutter官方示例APP,有豐富的示例,讀者可以在線下載安裝。Gallery的源代碼在Flutter源代碼examples目錄下。
社區
StackOverflowkOverflow,那么StackOverflow就是目前世界上最大的程序員問答社區,而且現在也是Flutter問答社區。除了Flutter用戶在StackOverflow上的交流外,Flutter開發團隊的成員也經常在上面回答問題。
博客:隨著Flutter技術的普及,相信網上有很多與Flutter相關的文章和博客,讀者可以閱讀很多。