關於Flutter

「就像你問我怎麼才能造坦克,我就必須把從冶金到化工整個現代化工業體系給你講一遍。」——tombkeeper編程

 

Flutter是什麼?安全

Flutter是一款移動應用程序SDK,一份代碼能夠同時生成IOS和Android兩個高性能、高保真的應用程序。數據結構

Flutter目標是使開發人員可以交付在不一樣平臺上都感受天然流暢的高性能應用程序。兼容滾動行爲、排版、圖標等方面的差別。併發

應用程序使用Dart語言編寫的,若是使用過Java或JavaScript之類的語言,則該應用程序看起來會很熟悉。框架

 

爲何要用Flutter?less

提升開發效率異步

  • 同一份代碼開發iOS和Android
  • 用更少的代碼作更多的事情
  • 輕鬆迭代
    • 在應用程序運行時更改代碼並從新加載(經過熱重載)
    • 修復崩潰並繼續從應用程序中止的地方進行調試

建立美觀,高度定製的用戶體驗ide

  • 受益於使用Flutter框架提供的豐富的Material Design和Cupertino(iOS風格)的widget
  • 實現定製、美觀、品牌驅動的設計,而不受原生控件的限制

 

Flutter和React-Native、Weex這樣的動態化框架有什麼不一樣?函數式編程

React-Native、Weex核心是經過Javascript開發,執行時須要Javascript解釋器,UI是經過原生控件渲染。Flutter與用於構建移動應用程序的其它大多數框架不一樣,由於Flutter既不使用WebView,也不使用操做系統的原生控件。 相反,Flutter使用本身的高性能渲染引擎來繪製widget。Flutter使用C、C ++、Dart和Skia(2D渲染引擎)構建。在IOS上,Flutter引擎的C/C ++代碼使用LLVM編譯,任何Dart代碼都是AOT編譯爲本地代碼的,Flutter應用程序使用本機指令集運行(不涉及解釋器)。而在Android下,Flutter引擎的C/C ++代碼是用Android的NDK編譯的,任何Dart代碼都是AOT編譯成本地代碼的,Flutter應用程序依然使用本機指令集運行(不涉及解釋器)。所以,Flutter能達到原生應用同樣的性能。函數

同時,Flutter提供了一組本身的widget),由Flutter的framework和引擎管理和渲染。您能夠瀏覽Flutter widget的目錄。之因此不適用原生控件,是由於Flutter但願最終結果是更高質量的,若是Flutter使用原生系統widget,Flutter應用的質量和性能將受到這些widget自己質量的限制。例如,在Android中,有一組硬編碼的手勢和固定的規則來對它們進行手勢衝突消歧。在Flutter中,您能夠編寫本身的手勢識別器,該手勢識別器是手勢系統中的一級參與者 。此外,由不一樣人撰寫的兩個小工具可協調手勢衝突消歧。

爲何Flutter選擇使用Dart語言?

Flutter在四個主要維度進行了評估,並考慮了框架做者、開發人員和最終用戶的需求等因素。咱們發現不一樣的語言在不一樣的層面符合一部分需求,但Dart在全部評估維度上得分都很高,而且符合咱們的全部要求和標準。

Dart運行時和編譯器支持Flutter的兩個關鍵特性的組合:基於JIT的快速開發週期:容許使用類型的語言進行形狀更改和有狀態的熱重載;以及AOT編譯器,可生成高效的ARM代碼,能夠快速啓動並擁有可預測的生產部署性能。

此外,咱們有機會與Dart社區密切合做,Dart社區正在積極投入資源改進Dart在Flutter中的使用。例如,當咱們採用Dart時,該語言沒有提供生成原生二進制文件的工具鏈(這對於實現可預測的高性能是頗有幫助的),可是如今實現了,由於Dart團隊爲Flutter構建了它。一樣,Dart VM以前已經針對吞吐量進行了優化,但團隊如今正在優化VM的延遲時間,這對於Flutter的工做負載更爲重要。

Dart在如下主要標準上獲得高分:

  • 開發人員的效率。Flutter的主要價值主張之一是經過讓開發人員使用相同的代碼庫爲iOS和Android建立應用程序,從而節省了工程資源。使用高效的語言能夠進一步加速開發週期,並使Flutter更具吸引力。這對咱們的framework團隊和開發人員都很是重要。大部分Flutter功能都是用Dart實現,所以咱們須要在10萬行代碼時能保持高效的而不會犧牲framework和widget的可讀性。
  • 面向對象。雖然咱們可使用非面向對象的語言,但這意味着要從新解決幾個難題。另外,絕大多數開發人員都具備面向對象開發的經驗,所以更容易學習如何使用Flutter進行開發。
  • 可預測,高性能。藉助Flutter,咱們但願使開發人員可以快速建立流暢的用戶體驗。爲了實現這一點,咱們須要可以在每一個動畫幀中運行大量的代碼。這意味着咱們須要一種既能提供高性能又能提供可預測性能的語言,而不會出現會致使丟幀的週期性暫停。
  • 快速內存分配。Flutter框架使用函數式流,它很大程度上依賴於底層的內存分配器,從而有效地處理小的、短時間的內存分配會很是重要,因此在缺少此功能的語言中Flutter沒法有效地工做。

 

Flutter框架使用什麼編程範式?

Flutter是一個多範式編程環境。在Flutter中使用了過去幾十年中開發的許多編程技術。咱們使用的每個範式都是咱們相信該它的優點特別適合Flutter:

  • 組合:Flutter使用的主要範例是使用小對象,而後將它們組合在一塊兒以得到更復雜的對象。Flutter widget庫中的大多數widget都是以這種方式構建的。例如,Material FlatButton 類是使用MaterialButton 類構建, 該類自己使用IconTheme、InkWell、Padding、Center、Material、AnimatedDefaultTextStyle和ConstrainedBox組合 構建。該InkWell 使用內置GestureDetector。Material 是使用內置AnimatedDefaultTextStyle、NotificationListener和AnimatedPhysicalModel。等等,它們都是widget。

  • 函數式編程:整個應用程序能夠僅使用StatelessWidget來構建 ,這些函數本質上是描述參數如何映射到其餘函數的函數。在計算佈局或繪製圖形的底層(這些應用程序不擁有狀態,所以一般是非交互式的)例如,Icon widget本質上是一個將其參數(顏色、 icon、size)映射到佈局基本單元的函數。此外,大量使用的是不可變數據結構,包括整個Widget類層次結構以及許多支持類,如 Rect和 TextStyle也都是。Dart中的Iterable API常常用來處理框架中的值列表,它大量使用了函數式(map,reduce,where等)方法。
  • 事件驅動:用戶交互由事件對象表示,這些事件對象被分派給註冊了事件處理程序的回調。屏幕刷新也由相似的回調機制觸發。監聽類是動畫系統的基礎,它確立了與多個監聽事件訂閱模式。
  • 基於類的面向對象編程:框架的大部分API都是使用繼承類來構建的。咱們使用一種方法來在基類中定義很是抽象的API,而後在子類中迭代地對它們進行定製化。例如,咱們的渲染對象有一個與座標系無關的基類(RenderObject),而後咱們有一個子類(RenderBox),它引入了基於笛卡爾座標系(x / width)和Y /高度)。
  • 基於原型的面向對象編程:  ScrollPhysics 類將實例連接起來組成適用於在運行時動態滾動的physics。這使得系統能夠編寫包含特定平臺physics的分頁physics,而無需在編譯時選擇平臺。
  • 命令式編程:直接命令式編程一般與對象內部封裝的狀態配對,用於提供最直觀的解決方案。例如,測試是以一種強制性風格編寫的,首先描述測試中的狀況,而後列出測試必須匹配的不變量,而後根據測試須要推動時鐘或插入事件。
  • 響應式編程:widget和元素樹有時被描述爲響應式的,由於在widget的構造函數中提供的新輸入會當即做爲widget的構建方法對較低級別widget的更改傳播,並在較低widget中進行更改(例如,做爲響應到用戶輸入)經過事件處理程序傳播回widget樹。根據widget的需求,功能嚮應和命令響應兩方面都存在於框架中。具備構建方法的widget僅由一個表達式組成,該表達式描述了widget如何對其配置中的變化作出反應的功能響應widget(例如,Divider類)。 構建方法經過幾個語句構建子項列表的widget,描述了widget如何對其配置中的更改做出反應,這些都是命令性響應widget(例如 Chip類)。
  • 聲明式編程:widget的構建方法一般是具備多層嵌套構造函數的單一表達式,使用Dart的嚴格聲明子集編寫。這樣的嵌套表達式能夠機械地轉換成任何適合表達的標記語言或從任何適合表達的標記語言轉換。例如, UserAccountsDrawerHeader widget具備很長的構建方法(20行以上),由單個嵌套表達式組成。這也能夠與命令式風格相結合來構建用純粹聲明式方法難以描述的UI。
  • 泛型:類型可用於幫助開發人員及早發現編程錯誤。Flutter框架使用泛型編程來處理這個問題。例如, State類根據其關聯widget的類型進行參數化,以便Dart分析器能夠捕獲狀態和widget的不匹配。相似地, GlobalKey類須要的類型參數,以便它能夠訪問遠程widget的狀態下在一個類型安全的方式(使用運行時檢查), 路由接口是參數化時,它是預期使用類型 pop和集合,例如List、Map和 Set都是參數化的,這樣能夠在分析過程當中或在調試期間的運行時提早捕獲不匹配的元素。
  • 併發:Flutter大量使用 Future和其餘異步API。例如,動畫系統經過Future來完成動畫完成時的通知。圖像加載系統一樣使用Future在加載完成時進行報告。
  • 約束:Flutter中的佈局系統使用弱形式的約束編程來肯定場景的幾何形狀。約束(例如,對於笛卡爾盒子,最小和最大寬度以及最小和最大高度)從父母傳遞給孩子,而且孩子選擇生成的幾何結構(例如,對於笛卡爾盒子,大小,特別是寬度和高度)知足這些限制。經過使用這種技術,Flutter一般能夠經過一次遍及整個場景。

 

Flutter和別的開發之間的關係?

以前有很多朋友,在公衆號裏問我,是學習Flutter開發仍是學習安卓開發?這個問題在我看來其實並不完整,由於一樣你還能夠問是學習Flutter開發仍是iOS開發?是學習Flutter開發仍是學習Web開發?

 

經過此次Developer Keynote咱們能夠看出,Flutter是一種跨平臺技術,而不屬於Android技術,Goole的Android團隊對於Flutter隻字未提,而是建議使用Kotlin語言來進行開發。那麼Google爲何還要開發Flutter技術呢?由於跨平臺開發市場即便Google不作也會有其餘公司去作,好比FaceBook的RN,阿里的Weex。所以Flutter其實是在和這些公司的產品搶市場,而不是在和本身的Android團隊搶市場。

 

因此這種問題其實沒有什麼標準的答案,你喜歡哪一個技術就能夠去學哪一個技術,Flutter和Adroid並非那種二選一的關係,而是一種共生的關係。Flutter團隊會繼續完善這個跨平臺開發的框架,Android團隊也會繼續發展本身的原生開發環境,他們都有着各自的優點,相信將來都會變得更加美好。

——郭霖《一篇文章帶你看遍Google I/O 2019大會》

 

Flutter中文網:https://flutterchina.club/technical-overview/

Flutter-FAQ:https://flutterchina.club/faq/

相關文章
相關標籤/搜索