標籤:

Flutter 特性及使用體驗

界面開發模式

經典界面編程模式屬於響應式,實例化控制項並響應控制項的事件。譬如響應繪製(OnPaint),滑鼠點擊(OnClick),重新繪製某個區域(InvalidateRect)。每個控制項的消息由操作系統發給該實例。但是Flutter的編程完全不一樣了,屬於申明式的,Makefile 就屬於典型的申明式。

如下典型的界面布局:

經典布局

譬如 Expanded 能夠佔滿整個可能區域,Column 行式布局。

結構體系

申明式只是 Flutter 一個不太重要的特性,但是是最容易理解的,還有很多特性,眾多特性才能讓 Flutter 擁有足夠的優勢。要做到申明式並不容易,需要整個體系結構支持。

-) 線程模型。Flutter App有三個主要線程:

  • Native 也就是系統的主線程
  • Dart VM線程,我們寫的Dart代碼就運行在這個線程
  • "GPU線程",2D引擎(Skia)運行線程負責控制GPU
  • Flutter也會啟動其他工作線程負責IO,Image Decode等臨時任務

如此規劃線程讓App開發簡單了太多,畢竟不需要關注工作線程和界麵線程間的關係、繪製效率。

-) Dart 語言。Dart 幾乎是 Closure 閉包最優雅的實現,還有強大的非同步支持。

/// 同步讀取文件內容nString content = await new File(filePath).readAsString();n

非同步讀取文件

Future<String> inner() {n return new File(filePath).readAsString().then(String cotent) {n print("file content: $content");n });n}n

非同步調用的跨函數傳遞是一個難題,Dart的解決方案

Future<Map> outside() {n return inner().then((String content) {n return JSON.decode(content); n });n}nnvoid someFunction() {n outside().then((Map map) {n print("map length: ${map.length}");n });n}n

加上異常處理也不會顯得麻煩,這裡不啰嗦了。這樣就能使用閉包處理界面事件了。

界面也有各種 FutureBuilder 等工具解決界面和非同步關係。

用好 Future,不使用 await,僅這個策略絕對能讓界面不會卡頓,相比幾乎所有原生開發者都為卡頓苦惱過。

-) 閉包和嵌套的申明帶來一個嚴重問題就是括弧的匹配。沒有比 Dart 更優雅的解決方案了。

Dart 提供了 dartfmt 工具來完成格式化,我一般使用的編輯器VSCode。編碼過程中一般不會管什麼對齊、空格、縮進,寫得差不多了就會按一個格式化的快捷鍵,就完成了格式化。可以說功能一樣的代碼絕對不會存在第二種格式。Dart 的文檔化做得也是沒有誰了,可以方便的使用 dartdoc 生成文檔。Flutter Team 更是規定了注釋、命名等規範,也提供了格式化Java/Objective-C語言,這樣整個工程會非常整潔。

-) Flutter很早就在FAQ里說Dart的一個重要特性是生產效率高,我不以為然,但是使用過一段時間dart後,被深深折服了,這貨生產效率絕對有保障。

Dart 靜態檢查

Dart 的靜態類型檢查做到了極致,超越現有任何一種語言。上圖的.name提醒,而下面沒有提醒,不用贅述了。

其次自動完成等基礎功能幾乎所有語言都能做到,更沒有說的必要了。

下一篇會說說調試方法、單元測試以及Plugins插件的開發。


推薦閱讀:

TAG:移动开发 | Dart |