2020年5月6日,Flutter終於迎來的本年的第一個穩定版本:1.17.0
,距離上一個穩定版本的釋出已經過去了將近5個月(146天)。受到世界範圍的你我都知道的情況影響,今年的Google I/O也被取消,一定程度影響了本次版本的釋出。同時在臨近釋出前出現了具有嚴重影響的BUG,也導致釋出時間再次被推遲。
那麼1.17.0
到底更新了什麼?是不是能再一次顛覆使用體驗?能否讓開發者再次真香?以下通過對Medium原文進行部分總結翻譯以及補充,為各位進行解答~(如有錯漏歡迎指出)(有英文原文沒有的內容噢?)
寫在前面
本次Flutter版本的釋出,開發團隊將更多的時間用於構建新的釋出流程架構。自上一次釋出穩定版本以來,已解決了6339個問題(issue),分別從231位開源貢獻者合併了3164個提交請求。得益NeverCode與團隊的合作,今年團隊在Flutter的倉庫上關閉的issue比新增的issue更多,總數減少了約800個。與Flutter一同釋出的還有Dart 2.8、iOS新增Metal渲染支援、新的Meterial元件和新的網路追蹤除錯工具等。
移動端效能及應用大小優化
效能及記憶體優化的工作是這次新版本的重點。升級到新版本後,使用者將立刻感受到更流暢快速的動畫、更小的應用大小以及更低的記憶體佔用。現在一般的路由變換場景(非透明的路由過渡)將提速20%-37%。根據不同裝置硬體效能的不同,在簡單的iOS動畫上能減少最多40%的CPU/GPU使用率(engine#14104 / engine#13976)。
該版本還包含了大量的應用大小優化。例如官方的展示應用Flutter Gallery的Android應用包大小從9.6MB減小到了8.1MB(18.5%)。
另外在記憶體使用率方面,帶有圖片的列表在快速滾動時造成的記憶體佔用及波動一直是Flutter的痛點之一。該版本將快速滾動帶圖片(大圖)列表場景的記憶體使用率降低了70%。
但,最值得說明的效能強力提升是對iOS Metal的支援。
Metal的支援為iOS應用帶來了50%的效能提升
Metal是與iOS 8一同釋出的API,具有兼顧圖形與計算功能、面向底層、低開銷的硬體加速[4]等優勢。Flutter現已預設使用Metal,讓使用者應用的平均渲染速度加快了50%(由實際業務決定)。
而在不支援Metal的裝置上(A7處理器及iOS 10以下),Flutter將繼續使用OpenGL進行渲染。
Material部件:NavigationRail
、DatePicker
、VisualDensity
及更多
Flutter團隊正在持續地根據客戶的反饋推進Flutter中Material Design的實現。本次由Material Design團隊設計並實現了一個用於響應式App佈局的路由元件NavigationRail
,該元件能與BottomNavigator
快速轉換,在裝置尺寸變大時隨之改變,能很好地適應移動端與桌面版的佈局。
快速體驗 NavigationRail
可以訪問 demo 或在 dartpad 上進行嘗試。
此外,基於Material Design的日期選擇器DatePicker
也已一同釋出。新的DatePicker
使用了符合Material指導的視覺效果,通過詳情文章可以瞭解到更多。
VisualDensity
也是新引入的內容,其指代的是Material Design中各類元件的視覺密度。通過調整它可以使得標準Material元件之間更加緊湊或疏遠。新版本在ThemeData
中引入了設定(ThemeData.visualDensity
)。詳細介紹請移步文件。
文字選擇選單也已針對平臺做了相應的改進。現在選單內的選項超出螢幕寬度時將會自動收起並可以通過與原生一致的操作切換,解決了某些語言中操作項的文字過長時佈局溢位的問題。
與1.17一起,Flutter團隊一同釋出了基於Material 運動系統的預設動畫元件包。
在Material的運動系統介紹文章中,Material Design團隊定義了從元件到全屏檢視的四種動畫變化型別:容器轉換、共軸轉換、交叉漸變、漸變。儘管Flutter原本就可以實現對應效果,但該動畫元件包能讓開發者更輕鬆地實現它們。
Material文字:更現代化的Flutter文字主題
在該版本的釋出中,Flutter團隊在相容以前版本的App的前提下完整整合了2018標準的Material Design文字大小定義。原有的TextTheme
API使用未受影響,但現在被標記為廢棄,提醒開發者儘快遷移到新的標準。
在Flutter的TextTheme
中,bodyText1
和bodyText2
對應著Material Design的body1
和body2
。類似的還有H1-H6
,對應headline1-headline6
。
用於Flutter的谷歌字型
如果你對新的Material Design文字縮放感興趣,那麼相信你對在Flutter中使用GoogleFonts
也抱有非常大的期待。
GoogleFonts
讓開發者能輕易地在開發的App中體驗和使用fonts.google.com
上的所有字型,開發者可以選擇讓使用者直接通過API下載字型,或在應用中內建提供這些字型。
輔助功能和國際化
Flutter團隊持續關注的另一個方向便是輔助功能,它將讓Flutter應用的應用範圍更加廣泛並且為特定場景增加了可用性。在該版本中針對滑動、文字、輸入框及其他輸入元件修復了大量問題。官方推薦開發者根據文件中更新的最佳實踐去測試自己的應用。
在國際化方面,團隊針對三星輸入法對許多東亞語言的影響完成了修復。思密達開發者們應該會慶祝這些改動?
工具:整合Flutter的Dart DevTools、Android快速啟動應用除錯及更多
該版本的釋出伴隨著即將釋出的與Flutter進行整合的Dart DevTools,如果你想立刻嘗試它,請啟動DevTools並點選右上角的"beaker"圖示。
在預釋出的DevTools中,你會看到多項優化點,但最重要的一項便是Network
(網路)選項卡。
網路選項卡現在可以檢視來自應用的網路請求,方便快速地排查請求問題。如果開發者在DevTools中沒有找到該選項卡,可以通過以下命令來進行升級或啟用:
$ pub global actiat devtools
複製程式碼
預設情況下,網路選項卡會在你點選"Record"(開始記錄)後顯示你的網路活動,但如果開發者希望從App啟動開始時就記錄,可以在main()
入口中使用以下方法:
void main() {
// 啟用網路請求輸出
HttpClient.enableTimelineLogging = true;
runApp(MyApp());
}
複製程式碼
新的DevTools帶來了另一項實驗性功能:安卓“快速啟動”,讓開發者開啟除錯的速度加快70%。這項功能可以通過flutter run --fast-start -d <your Android Device>
開啟。使用功能時,一個僅基於平臺程式碼、不含dart程式碼和資源變動的“殼”APK包將被安裝到裝置上。由於修改dart程式碼或資源並不需要APK重新構建,這會讓flutter run
更快地啟動。與傳統的啟動模式不同,這個功能會將你的程式碼包裝在一個殼中執行。在某些情況下這項功能將無法生效,例如在應用使用了原生外掛呼叫了方法。
從該版本起,建立新的Flutter應用時,將僅允許建立使用AndroidX的應用。團隊已將所有的support API標記為廢棄,在建立新專案時--android
引數是唯一有用的引數。雖然support版本的應用仍然能正常打包,但此時不遷移更待何時?
如果開發者是Android Studio或者IntelliJ使用者,會發現熱過載變得更為靈活了。在以前當分析器認為程式碼中存在錯誤(error)時,將阻止開發者熱過載。當這些錯誤並不對你當前正在開發或除錯的功能造成影響時,會讓你花費更多的時間去處理這些錯誤,讓人惱火。自此分析器不再有權利阻止熱過載的程式,而交給VM編譯過程來進行判斷。
這些改動都發布在了對應的dev分支,如果開發者想盡快參與到其中,可以通過此處報名。通過參與新版本的測試更頻繁的更新,與Flutter團隊反饋使用感想,將讓編譯器外掛更加健壯。
對於VS Code開發者,團隊推薦一項新的功能:Dart: List Outdated Packages(pub outdated
)。它可以幫助開發者排查依賴版本不匹配導致的問題。
最後,如果開發者碰到了Flutter crash,工具將引導開發者以正確的方式上報異常,Flutter團隊會密切關注這類錯誤的嚴重程度和頻率。
不相容的改動
該版本中包含以下重大不相容API改動:
- #42100 使用pushReplacement時呼叫secondaryAnimation
- #44930 Navigator 2.0 命令式API改動
- #45940 廢棄UpdateLiveRegionEvent
- #49389 延遲快速滾動時的影像解碼
- #49391 Android文字選擇溢位
- #49771 不對空Painter設定cache斷言
- #50318 實時的圖片快取
- #50354 使用strut box高度計算矩形,以確保它們在可見範圍內
- #50733 為gen_I10n生成資訊查詢
- #51435 從
RouteSettings
中移除isInitialRoute
- #52781 將
mouse_tracking.dart
移動至rendering
寫在最後
2020年註定是不平凡的一年,對於Flutter來說也不例外。但Flutter Team仍然在谷爹的強力支援下堅持了下來,並且做了巨量的工作,向團隊致敬!
最後照例歡迎各位加入Flutter Candies,一起製造可愛好用的?。 (QQ群:181398081)
References: