Flutter – 1.簡介

天涯不歸客發表於2018-12-19

Flutter 是 Google 開源的跨平臺移動開發框架。 用一套程式碼為 iOS 和 Android 構建高效能,美觀的應用程式。它也是 Google 即將推出的 Fuchsia 作業系統的開發平臺。此外,它的架構可以通過定製的 Flutter 引擎將其引入其他平臺。

Flutter 特點

Flutter 試圖使移動開發更友好, 它為開發人員提供應用程式框架和可移植的執行時引擎。該框架建立在 Skia 圖形庫上,提供實際呈現的部件,而不僅僅是原生控制元件的包裝。

Flutter 做跨平臺開發能夠像 web 一樣靈活,但同時提供流暢的效能。Flutter 附帶的部件庫以及開源部件使其成為一個功能豐富的平臺。簡單地說,Flutter 是最接近移動開發人員用於跨平臺開發的理想平臺,靈活性、效能幾乎毫無妥協。

Dart

Flutter 使用谷歌開發的 Dart 語言進行開發。 Google給出了選擇Dart開發Flutter的理由:

  1. Dart執行時和編譯器支援Flutter的兩個關鍵特性的組合:
  • 基於JIT的快速開發週期:允許使用型別的語言進行形狀更改和有狀態的熱過載;
  • 以及AOT編譯器,可生成高效的ARM程式碼,可以快速啟動並擁有可預測的生產部署效能。
  1. 開發人員的效率。Flutter的主要價值主張之一是通過讓開發人員使用相同的程式碼庫為iOS和Android建立應用程式,從而節省了工程資源。使用高效的語言可以進一步加速開發週期,並使Flutter更具吸引力。這對我們的framework團隊和開發人員都非常重要。大部分Flutter功能都是用Dart實現,因此我們需要在10萬行程式碼時能保持高效的而不會犧牲framework和widget的可讀性。
  2. 物件導向。雖然我們可以使用非物件導向的語言,但這意味著要重新解決幾個難題。另外,絕大多數開發人員都具有物件導向開發的經驗,因此更容易學習如何使用Flutter進行開發。
  3. 可預測,高效能。藉助Flutter,我們希望使開發人員能夠快速建立流暢的使用者體驗。為了實現這一點,我們需要能夠在每個動畫幀中執行大量的程式碼。這意味著我們需要一種既能提供高效能又能提供可預測效能的語言,而不會出現會導致丟幀的週期性暫停。
  4. 快速記憶體分配。Flutter框架使用函式式流,它很大程度上依賴於底層的記憶體分配器,從而有效地處理小的、短期的記憶體分配會非常重要,所以在缺乏此功能的語言中Flutter無法有效地工作。

Flutter 時間表

  • 2015 年 4 月,Flutter(最初代號 Sky)在 Dart Developer Summit 上展示
  • 2015 年 11 月,Sky 重新命名為 Flutter
  • 2018 年 2 月,在 2018 年移動世界大會上 Flutter beta 1 官宣
  • 2018 年 4 月,Flutter beta 2 官宣
  • 2018 年 5 月,在 Google I / O 上 Flutter beta 3 官宣。2018 年 6 月,Flutter 預覽版1釋出
  • 2018 年 9 月,Flutter 預覽版2釋出
  • 2018 年 12 月,Flutter 正式版1.0釋出

Flutter

Flutter 分為 Framework和 Engine,我們是基於執行在 Engine 上的Framework進行開發App。下面分別對各個模組進行介紹:

走進Flutter

Framework

Material

Flutter提供了一套豐富的Material widget,可幫助您構建遵循Material Design的應用程式。

Cupertino

Flutter也提供了一套豐富的Cupertino(iOS)風格的widget

Widgets

Flutter Widget採用現代響應式框架構建,據說是從 React 中獲得的靈感。widget的主要工作是實現一個build函式,用以構建自身。一個widget通常由一些較低階別widget組成。Flutter框架將依次構建這些widget,直到構建到最底層的子widget時,這些最低層的widget通常為RenderObject,它會計算並描述widget的幾何形狀。

Rendering

Flutter Widgets庫使用RenderObject層次結構來實現其佈局和繪製後端。 可以在應用程式中使用自定義RenderBox類來處理特定效果。但大多數情況下,都只是使用RenderObject層次除錯佈局問題。

如果直接在Rendering庫上開發自己的庫或應用程式,需要進行繫結(BindingBase)。預設的Widgets已經有Flutter完成繫結。 也可以使用RenderingFlutterBinding,建立自己的繫結。至少需要匯入ServicesBinding,GestureBinding,SchedulerBinding,PaintingBinding和RendererBinding。

Animation

Flutter 動畫庫,提供兩種動畫型別tween和physics-based。

  1. Tween動畫“介於兩者之間”的簡稱。在Tween中,定義了開始點和結束點、時間線以及定義轉換時間和速度的曲線。然後由框架計算如何從開始點過渡到結束點。
  2. physics-based動畫在physics-based動畫中,運動被模擬為與真實世界相似的行為。例如,當你擲球時,它在何處落地,取決於拋球速度有多快、球有多重、距離地面有多遠。 類似地,將連線在彈簧上的球落下(並彈起)與連線到繩子上的球放下的方式也是不同。

Painting

該庫包含Flutter引擎的繪製API,用於更專業的目的,例如繪製縮放影像,在陰影之間插值,在框周圍繪製邊框等。

Gestures

Gesture提供了手勢識別相關的功能,包括觸控事件類定義和多種內建的手勢識別器。

Engine

Flutter 引擎全部使用C++實現,提供Dart執行時和文字排版引擎(libtxt)和繪圖引擎Skia。SKia是一個 2D的繪圖引擎庫,可以直接將資料通過OpenGL或者 Vulkan,傳給GPU進行繪製。Chrome和 Android均採用 Skia作為繪圖引擎。Skia提供了非常友好的 API,並且在圖形轉換、文字渲染、點陣圖渲染方面都提供了友好、高效的表現。Skia是跨平臺的,所以可以被嵌入到 Flutter的 iOS SDK中,而不用去研究 iOS閉源的 Core Graphics / Core Animation。

來源:https://juejin.im/post/5c19b35d6fb9a049cb18af91

相關文章