自 1.2 版本以來,我們持續專注於提升質量和穩定性。Flutter 1.5.4 穩定版在臨近 Google I/O 大會之際,增加了一系列新功能。此外,Apple 要求在 12.1 版本的 iOS SDK 中進行構建,本次更新已滿足此要求。您只需拉取 1.5.4 穩定版,構建並更新您的 Flutter 應用到 Apple Store,即可滿足 Apple 的要求。

此外,本次構建修復了 Flutter 1.2 中的兩個迴歸問題。

  • #28640 NoSuchMethodError:**android.view.MotionEvent.isFromSource 已關閉,並在 1.3.7 版本之後的所有版本中得到修復。
  • #28484 Flutter 更新後 Widget 顯示異常:1.4.0 版本中已對該回歸問題進行修復。

最後,關於其他修復和新功能的詳細資訊,請繼續閱讀。

重大變更

#

我們最近的調查顯示,Flutter 開發者傾向於接受破壞性變更,如果這意味著 API 和 Flutter 的行為能夠得到改進。當然,我們仍然謹慎地進行破壞性變更。以下是本次釋出中的破壞性變更列表,以及每個變更的詳細描述和如何在 Flutter 程式碼中處理它們的連結。

嚴重的效能和崩潰修復

#

在此版本中,我們修復了多個嚴重的效能和崩潰問題。

  • flutter#30990:允許在 profile 模式下進行 profile widget 構建。
  • flutter#30985:新增 rrect contains 微基準測試。
  • flutter#28651:無法執行操作,因為 FlutterJNI 未附加到原生端。

iOS 變動

#

對 iOS 的支援對 Flutter 團隊來說與對 Android 的支援同等重要,您可以看到我們在本版本中進行了大量的修改,以進一步改善 iOS 的體驗。

  • flutter#29200:Cupertino 本地化第一步:新增英文 arb 檔案。
  • flutter#29821:Cupertino 本地化 1.5 步:修復 cupertino_en.arb 中的資源不匹配問題。
  • flutter#30160:Cupertino 本地化 1.9 步:為 cupertino_en.arb 新增所需的單數資源。
  • flutter#29644:Cupertino 本地化第三步:就地移動部分 Material 元件工具,為 Cupertino 騰出空間。
  • flutter#29650:Cupertino 本地化第四步:允許生成的日期本地化組合 Material 和 Cupertino 地區設定。
  • flutter#29708:Cupertino 本地化第五步:新增法語 arb 作為翻譯示例。
  • flutter#29767:Cupertino 本地化第六步:新增一個帶有日期時間格式的 GlobalCupertinoLocalizations 基類。
  • flutter#30527:Cupertino 本地化第 11 步:在說明中新增更多翻譯說明。
  • flutter#28629:確保在向右滑動返回時,Cupertino 頁面過渡中的所有內容都可以線性進行。
  • flutter#28001:CupertinoTextField:添加了更改佔位符顏色的功能。
  • flutter#29304:為 iOS 在語義樹中包含 platformViewId。
  • flutter#29946:允許 CupertinoPageScaffold 在點選狀態列時滾動到頂部。
  • flutter#29474:允許 CupertinoTextField 的清除按鈕也呼叫 onChanged。
  • flutter#29008:更新 CupertinoTextField。
  • flutter#29630:將心形新增到 CupertinoIcons 中。
  • flutter#28597:調整剩餘的 Cupertino 路由動畫以匹配原生。
  • flutter#29407:[cupertino_icons] 新增 circle 和 circle_filled,用於單選按鈕。
  • flutter#29024:修復 CupertinoTabView 在檢視插值(view inset)變化時重新塑形的問題。
  • flutter#28478:支援報告壓力資料為 0 的 iOS 裝置。
  • flutter#29987:更新 CupertinoSwitch 文件。
  • flutter#29943:移除導航欄和安全區域子元素之間不必要的間隙。
  • flutter#28855:將 Material iOS 向後滑動測試移至 Material。
  • flutter#28756:處理被 Navigator push 中斷的 Cupertino 後退手勢。
  • flutter#31088:TextField 滾動物理。
  • flutter#30946:新增更多 Cupertino 圖示。
  • flutter#30521:在 CupertinoTheme 中提供預設的 IconTheme。
  • flutter#30475:Trackpad 模式崩潰修復。

Material 元件變動

#

當然,Material 元件仍然是 Flutter 團隊的重點。

  • flutter#28290:[Material] 建立 FloatingActionButton ThemeData 並在 FloatingActionButton 中遵守它(#28735)。
  • flutter#29980:修復賬戶抽屜頭部箭頭在呼叫 setState 時旋轉的問題。
  • flutter#29563:拖動選擇文字時避免閃爍。
  • flutter#29138:更新 DropdownButton 下劃線以支援自定義。
  • flutter#29572:DropdownButton 圖示可定製性。
  • flutter#29183:在 TabBarTheme 中實現 labelPadding 配置。
  • flutter#21834:在 AppBar 中新增 shapeBorder 選項。
  • flutter#28163:[Material] 新增為 Chip 和 Chip 主題設定陰影顏色和選中陰影顏色的功能。
  • flutter#27711:使擴充套件 FAB 的圖示可選。
  • flutter#28159:[Material] 擴充套件 BottomNavigationBar API(重述)。
  • flutter#27973:向 Scaffold 新增 extendBody 引數,body 的 MediaQuery 反映 BAB 高度。
  • flutter#30390:[Material] 使用新的尺寸、形狀和顏色對映更新 Slider 和 SliderTheme。
  • flutter#29390:使 ExpansionPanel 可以透過點選其標題來選擇性地切換狀態。
  • flutter#30754:[Material] 修復由舊上下文導致的 showDialog 崩潰。
  • flutter#30525:修復輸入框寬度外的游標問題。
  • flutter#30805:使用 Scaffold 模板更新 ExpansionPanelList 示例。
  • flutter#30537:嵌入影像並將變體新增到 ListTile 示例程式碼中。
  • flutter#30455:透過確保卡片尺寸適合螢幕,防止 shrine 中的垂直滾動。
  • flutter#29413:僅使用 builder 時修復 MaterialApp 的 _navigatorObserver。

桌面端變動

#

Flutter 在擴充套件對桌面級輸入機制的支援方面取得了進展,包括鍵盤對映、文字選擇、滑鼠滾輪和懸停,以及我們工具鏈中的桌面支援的初步工作。

框架變動

#

除了平臺特定功能之外,我們還在繼續推進 Flutter 框架的核心。

  • engine#8402:啟用關閉 VM 中的所有根 Isolate。
  • flutter#31210:在 Android v2 上使用字形的完整高度來計算插入符(caret)的高度。
  • flutter#30422:一旦抬起後退手勢,立即提交 navigator.pop。
  • flutter#30792:重新命名 Border.uniform() 為 Border.fromSide()。
  • flutter#31159:撤銷“在 Android 上使用字形的完整高度來計算插入符(caret)的高度”。
  • flutter#30932:2D 變換使用者體驗改進。
  • flutter#30898:檢查 ErrorWidget.builder 在測試後未被修改。
  • flutter#30809:修復問題 23527:異常:RenderViewport 超出最大數量…
  • flutter#30880:讓 sliver.dart 中的 _createErrorWidget 與其他 Widgets 一起工作。
  • flutter#30876:簡化 toImage future 處理。
  • flutter#30470:修復了 Table flex 列布局錯誤 #30437。
  • flutter#30215:檢查無效的 elevation。
  • flutter#30667:修復額外的 @mustCallSuper 間接覆蓋和 mixins。
  • flutter#30814:修復 StatefulWidget 和 StatelessWidget 示例文件。
  • flutter#30760:修復 invokeListMethod 和 invokeMapMethod 中的 cast NPE。
  • flutter#30640:新增 const Border.uniformSide()。
  • flutter#30644:使 FormField._validate() 返回 void。
  • flutter#30645:為 FormFieldValidator 新增文件。
  • flutter#30563:修復了 Expanded API 文件中的一個拼寫錯誤。
  • flutter#30513:修復問題 21640:斷言錯誤 : '_listenerAttached': is not true。
  • flutter#30305:更簡潔的可空列表副本。
  • flutter#30468:BottomNavigationBar 的嵌入圖。

外掛變動

#

在此版本中,Flutter 外掛也有一些變動,包括 camera、Google Maps、WebView、image_picker、Firebase 外掛,以及現在可供您的應用使用的 應用內購買外掛 beta 版

  • plugins#1477:[camera] 移除 Activity 生命週期。
  • plugins#1022:[camera] 為 camera 外掛新增序列 dispatch_queue 以避免阻塞 UI。
  • plugins#1331:[connectivity] 支援獲取當前 Wi-Fi 網路的 BSSID。
  • plugins#1455:[connectivity] 添加了整合測試。
  • plugins#1377:[firebase_admob] 更新文件以新增 iOS Admob ID,並在示例專案中新增 iOS Admob ID。
  • plugins#1492:[firebase_analytics] 初始整合測試。
  • plugins#896:[firebase-analytics] 為 iOS 啟用 setAnalyticsCollectionEnabled 支援。
  • plugins#1159:[firebase_auth] 啟用無密碼登入。
  • plugins#1487:[firebase_auth] 將 FlutterAuthPlugin 從已棄用的 API 遷移。
  • plugins#1443:[firebase_core] 將 Gradle BoM 與 firebase_core 一起使用。
  • plugins#1427:[firebase_crashlytics] 不要破壞除錯日誌格式。
  • plugins#1437:[firebase_crashlytics] 修復 Fabric 初始化問題。
  • plugins#1096:[firebase_database] 從 DatabaseError#toString() 返回錯誤訊息。
  • plugins#1532:[firebase_messaging] 移除過時的文件說明。
  • plugins#1405:[firebase_messaging] iOS 的附加步驟。
  • plugins#1353:[firebase_messaging] 更新示例。
  • plugins#1223:[firebase_ml_vision] 修復在 iOS 上掃描 URL QR 碼時崩潰的問題。
  • plugins#1514:[firebase_remote_config] 初始整合測試。
  • plugins#815:[google_maps_flutter] 添加了從位元組陣列(PNG)載入自定義圖示的支援。
  • plugins#1229:[google_maps_flutter] Marker API 現在是基於 Widget 的(Android)。
  • plugins#1421:[in_app_purchase] 使支付 API 統一。
  • plugins#1380:[in_app_purchase] 載入購買。
  • flutter#26329:IAP:購買自動續訂訂閱。
  • flutter#26331:IAP:購買非續訂訂閱。
  • flutter#26326:IAP:載入之前的購買記錄。
  • plugins#1249:[in_app_purchase] payment queue dart ios。
  • flutter#26327:IAP:購買解鎖。
  • flutter#26328:IAP:購買消耗品。
  • flutter#29837:當 barcode_scan 和 image_picker 一起使用時,image_picker 閃爍。
  • flutter#17950:如果 Flutter Activity 在原生 Activity 顯示時被殺死,image_picker 外掛將失敗。
  • flutter#18700:[image_picker] 在嘗試使用相機時,Galaxy S5 和 Note 4 崩潰。
  • plugins#1372:[image_picker] 修復“如果先訪問了相機,則相簿中的取消按鈕不可見”。
  • plugins#1471:[image_picker] 修復從 Google Photos 返回的無效路徑。
  • flutter#29422:image_picker 錯誤:許可權拒絕。
  • plugins#1237:[share] 將 share 外掛的 compileSdkVersion 改為 28。
  • plugins#1373:[shared_preferences] 新增 contains 方法。
  • plugins#1470:[video_player] Android:添加了缺失的 event.put("event", "completed");
  • flutter#25329:[WebView] 允許 WebView 在即將載入 URL 時接管。

工具變動

#

最後但同樣重要的是,我們對 Flutter 核心倉庫中的工具進行了一系列更改,以改善開發者的體驗,尤其是在提高熱過載效能方面(您以前覺得它還不夠快嗎!)。

  • flutter#29693:使用編譯器中的源列表來跟蹤熱過載的失效檔案。
  • flutter#28152:提高熱過載效能。
  • flutter#29494:用於工具的覆蓋率生成指令碼的初始工作。
  • flutter#31171:允許透過環境變數停用所有指紋快取。
  • flutter#31073:Fuchsia 第一步:新增 SDK 版本檔案和工件下載。
  • flutter#31064:為 flutter version 命令新增排序功能。
  • flutter#31063:下載並處理 Flutter 打補丁的 SDK 的產品版本。
  • flutter#31074:使 CoverageCollector 的 flutterProject 選項成為可選。
  • flutter#30818:新的 flutter drive 標誌,用於跳過在裝置上安裝新應用。
  • flutter#30867:新增 debugProfileWidgetBuilds 的切換開關。
  • flutter#27034:更新了包模板的 .gitignore 檔案。
  • flutter#30115:轉發丟失的 pub 命令。
  • flutter#30254:Reland:確保 flutter run/drive/test/update_packages 只下載所需的工件。
  • flutter#30153:允許在穩定分支上停用實驗性命令和裝置。
  • flutter#30428:為 Arch Linux 更新 repair 命令。

此外,自 Flutter 上一個穩定版本以來,IDE 外掛也得到了一系列更新。

動態更新(又名 Code Push)

#

最後,我們即將接近年中,是時候重新評估我們可以在哪些領域產生最重要的影響了。我們決定從 2019 年路線圖中移除動態更新(即 code push)的計劃。如果您對此原因感興趣,可以閱讀詳細解釋。放棄這項工作使我們能夠更加專注於質量,以及我們在 Flutter for Web 和 Flutter for Desktop 方面的實驗。

完整問題列表

#

您可以在 此版本中提交的 PR 列表 檢視完整列表。