Dart 2.3 發布 帶來構建 UI 新特性
Google I/O 2019 第二天,官方發布了 Dart 2.3 穩定版本。此版本針對構建用戶界面進行了優化,改善了開發者在開發 UI 時的編碼體驗,為開發 Flutter UI 提供了新的工具支持,同時還提供了兩個新的網站:dart.dev 與 pub.dev。
用于構建用戶界面的新語言特性
在客戶端開發方面, Dart 與 Flutter 團隊之間長期合作的項目之一就是使用 Dart 捕獲用戶界面代碼,而不需要標記語言。開發團隊認為對行為和布局使用單一語言具有很大的好處,包括減少上下文切換、不必學習兩種語言,并在構建 UI 時允許通用編程語言的所有抽象功能。
在 Dart 最近幾個版本中進行了一些改進,例如簡化構建 widget 的代碼,添加自動的 int-to-double 轉換以及添加 set literals。Dart 2.3 中,進一步帶來了三個用于描述 UI 的新特性:基于列表、條件與重復。
可以將 UI 視為 widget 節點的樹,一些節點包含 widget 列表,例如可滾動元素的列表。通常這些列表是從其它列表構建的。為此,添加了一個新的?spread operator?擴展運算符特性,用于將元素從一個列表解壓到另一個列表。在下面的示例中,buildMainElements() 返回一個 widget 列表,然后使用擴展運算符 … 將其解壓到周圍列表中:
Widget?build(BuildContext?context)?{??return?Column(children:?[????Header(),????...buildMainElements(),????Footer(),??]);}
另一個常見的 UI 任務是根據條件包含特定元素。例如,開發者可能希望在所有頁面上都帶有“下一步”按鈕,當然條件是最后一頁不需要這個按鈕。在 Dart 2.3 中,可以使用以下?collection if?執行此操作:
Widget?build(BuildContext?context)?{??return?Column(children:?[????Text(mainText),????if?(page?!=?pages.last)??????FlatButton(child:?Text('Next')),??]);}
最后,UI 經常從其它重復元素構建重復元素,可以使用新的?collection for?特性來描述這一點:
Widget?build(BuildContext?context)?{??return?Column(children:?[????Text(mainText),????for?(var?section?in?sections)??????HeadingAction(section.heading),??]);}
這三個新特性是語言特性,而不是標記命令,因此它們是完全可組合的,可以在處理集合的任何上下文中使用。這些特性包含在 Flutter 1.5 版本中,可在 Dart 2.3 版本中找到。
此外還添加了新的 lint,可以在靜態分析中配置這些 lint 以強制使用新的 spread、collection if 和 features for 特性。
IDE 和編輯器功能
配合 Dart 2.3 的 UI 特性改進,此版本還為 IDE 支持添加了新的 UI Guides 功能。UI Guides 是在 UI 代碼中繪制的水平和垂直線,使得更容易看到 Flutter UI build() 方法的樹結構。以下是一個計算器應用示例,其中 UI Guides 清楚地表示了?UI 是從包含多個 KeyRows 的擴展列構建的,每個 KeyRows 包含 NumberKeys。
UI Guides 在 IntelliJ IDEA 35.2 和 Android Studio 插件中提供。今后 VS Code 中也有望提供類似支持。
另一方面,開發者在使用 API 時經常會使用代碼自動補全功能,這一功能在補全已導入的庫中的 API 效果很好,但對于還未導入的庫則不起作用。新版本?IDE 現在彌補了這一不足,開發者現成可以在任何前綴上調用代碼補全,并且將看到當前包中所有 API 的完整性,它直接依賴的包以及 SDK。如果補全的是尚未導入的庫中的代碼,則 IDE 會為自動添加導入語句。
新的 Dart 與 Pub 網站
開發團隊為 Dart 平臺構建一個新網站:dart.dev,https://dart.dev。
該網站提供了一個全新的登陸頁面,專注于解釋 Dart 平臺的核心優勢,同時更新了文檔頁面,以獲得更好的導航和更具視覺吸引力。最后,對所有內容進行了大量重組,以使其更容易被發現,并為以前缺少的核心內容添加了新頁面。此外,更新了 Pub 包網站,并使用了方便的新 URL:pub.dev。