自 Flutter v1.0 釋出以來,我們的首要任務是繼續解決 Flutter 開發者和 Flutter 團隊本身報告的高優先順序問題。這包括自 12 月以來在 Flutter 引擎和框架中合併了 672 個拉取請求(我們一直很忙!)。我們已在下方列出了我們認為值得注意的新功能和破壞性更改。最大的更新來自我們的框架和工具標籤,但我們也發現並修復了幾個嚴重問題。

框架

#

為了更全面地完善 Flutter 的動畫支援,本次釋出增加了幾個標準的緩動函式

#25788 新增 Robert Penner 的緩動函式

為了更全面地整合 Android,本次釋出增加了對 Android App Bundles 的支援,這是一種有助於減小應用大小併為 Android 應用啟用動態交付等新功能的新打包格式。

#24440 新增對 android app bundle 的支援

為了更全面地整合 iOS,本次釋出為 iOS 增加了幾項新功能和修復,包括新的 CupertinoTheme

#25183 為 CupertinoTabView 新增 navigatorKey

#25593 讓 CupertinoTabScaffold 也處理鍵盤嵌入

#24876 新增淡入淡出效果,圓角,修復 iOS 上的偏移和游標高度

#23759 新增 CupertinoTheme

除了 iOS Cupertino 主題支援外,本次釋出還繼續增強了 Material 主題

#24169 [Material] 對話方塊的可主題化 elevation

#25339 [Material] AlertDialog 的可主題化 TextStyles

為了更全面地整合 Android 平板電腦和 ChromeOS 等桌面裝置,以及桌面 Web 和桌面作業系統支援,本次釋出增加了對鍵盤和滑鼠作為一流輸入裝置的支援。

#7758 組合字元實現的推薦實現

#27853 連線字元事件和未修改的程式碼點到 Android 原始按鍵事件處理

#27620 新增鍵盤按鍵程式碼生成器

#27627 新增對邏輯和物理按鍵事件的支援

#6961 為引擎新增懸停事件支援

#24830 為滑鼠指標實現懸停支援

由於小部件是與使用者互動的核心方式,本次釋出繼續為 Flutter 小部件集新增功能和修復,特別關注 SliverAppBar

#26021 修復 SliverAppBar 標題不透明度並測試所有情況

#26101 修復浮動吸附 SliverAppBar 崩潰

#25091 為 SliverAppBar 文件新增動畫

#24736 為 FAB 提供更多位置

#25585 在 TextStyle 中公開字型回退 API,滾動引擎 54a3577c0139..215ca1560088

#24457 修改 Material TextField 上的 Android 和 iOS 手勢

#24554 新增強制按壓手勢檢測器和識別器

#23919 允許檢測 TabBar 上的點選

#25384 新增對浮動游標的支援

#24976 支援 TextField 多行提示文字

#26332 Strut:精細控制文字最小行高,允許將行高強制設定為指定高度

最後,隨著 Flutter 在全球範圍內的使用不斷增長,我們繼續支援多種語言的本地化,包括本次釋出的烏克蘭語、波蘭語、斯瓦希里語和加利西亞語。

#25394 更新本地化

#27506 新增對斯瓦希里語的支援(material_sw.arb)

#27352 包括加利西亞語

外掛

#

與框架和引擎本身一樣,我們也繼續關注外掛質量

flutter/engine#7317 修復 iOS 平臺檢視的陳舊 GrContext

flutter/engine#7558 修復 iOS 平臺檢視丟失的觸控事件

flutter/plugins#1157 [google_maps_flutter] 修復 iOS 上的相機定位問題

flutter/plugins#1176 [firebase_auth] 修復 Android 上的 Firebase 電話身份驗證

flutter/plugins#1037 [camera] 儲存 iOS 上的照片方向

flutter/plugins#1129 [android_alarm_manager] 修復“不允許後臺啟動”問題,排隊接收過早的事件

flutter/plugins#1051 [image_picker] 修復 iOS 上多次點選選擇器時崩潰的問題

webview_flutter 外掛獲得了 Dart 和 JavaScript 之間的通訊通道

flutter/plugins#1116 新增 WebView JavaScript 通道(Dart 端)

flutter/plugins#1130 WebView JavaScript 通道 Android 實現

flutter/plugins#1139 WebView JavaScript 通道 - iOS 實現

lutter/plugins1021 JavaScript 評估 ios/android

我們在構建應用內購買外掛(仍處於預釋出階段)方面取得了進展

#1057 [IAP] 檢查支付處理器是否可用

#1084 [IAP] 從 Google Play 獲取 SkuDetails

#1068 IAP 產品列表 ios

#1172 [In_app_purchase] 新增支付 objc 翻譯器

Dart

#

本次釋出包含新的 Dart SDK,支援新的字面量語法,並透過減少呼叫建構函式或靜態方法的開銷,將 AOT 效能提高了 10-20%。

#37 字面量

#33274 新增對“裸”指令的支援:全域性物件池,pc 相關靜態呼叫,更快的間接呼叫,潛在的程式碼共享。

工具

#

在此次釋出中,我們為現有工具添加了許多新工具和新功能。

本次釋出繼續改進了各種工具的錯誤訊息

#26107 flutter tool --dynamic 標誌的更好錯誤訊息

#26084 改進儲存編譯訓練資料時的訊息

#25863 使用動態修補時的更友好訊息

本次釋出還增加了對 Java 1.8 的支援

#25470 支援 Java 1.8

嚴重問題

#

在此次釋出中,我們發現並修復了上個版本中的一些嚴重問題,包括兩次崩潰和一次效能下降。

崩潰

#7314 Flutter 啟動時崩潰(元錯誤)

效能

#25381 向裝置實驗室新增 cull opacity 效能測試

重大變更

#

為了繼續在 1.0 版本後改進 Flutter 以滿足客戶需求,我們不得不進行一些破壞性更改

#8769 將 ListItem 重新命名為 ListTile,並對 ListTile 的固定高度幾何進行了文件記錄

#

許多開發者對 ListItem 高度固定感到困惑。我們已將其重新命名為 ListTile,以表明(與其他 tile 一樣)其高度是固定的,並且文件已更新,明確說明了這一點。您需要在程式碼中將 ListItem 類的例項重新命名為 ListTile。

#7518 更新 iOS 嵌入的預設 flutter_assets 路徑

#

iOS 應用程式的 Flutter 資源現在位於 Frameworks/App.framework/flutter_assets 中,而不是 flutter_assets。flutter 命令列工具應能處理此差異,但如果您正在為 iOS 編寫共享 Flutter 資源的 AddToApp 應用程式,則需要注意此更改。

#27697 Cupertino TextField 游標修復

#

CupertinoTextField 的 cursorColor 預設值現在與應用的 theme 匹配。如果不需要此行為,開發者可以使用 ThemeData 的 cupertinoOverrideTheme 屬性,透過 CupertinoThemeData 物件提供 Cupertino 特定的覆蓋,例如:

dart
Widget build(BuildContext context) { 
  // Set theme data for override in the CupertinoThemeData's constructor 
  Theme.of(context).cupertinoOverrideTheme = CupertinoThemeData(  
    brightness: Brightness.dark,  
    primaryColor: Color(0xFF42A5F5) 
  ); 
  return Text( 
    'Example', 
    style: Theme.of(context).textTheme.title, 
  ); 
}

#23424 為 DragGestureRecognizer 新增拖動起始行為

#

預設情況下,拖動手勢檢測器的 onStart 回撥將在檢測到拖動手勢的位置(即拖動一定畫素數之後)而不是在觸控按下位置被呼叫。要使用具有給定拖動手勢識別器的舊功能,應將識別器的 dragStartBehavior 變數設定為 DragStartBehavior.down,例如,在宣告 GestureDecorator 時包含下面加粗的行。

dart
GestureDectector( 
  dragStartBehavior: DragStartBehavior.down,
  onVerticalDragDown: myDragDown 
  onVerticalDragEnd: myDragEnd, 
  onVerticalDragStart: myDragStart, 
  onVerticalDragUpdate: myDragUpdate, 
  onVerticalDragCancel: myDragCancel, 
  onHorizontalDragDown: myDragDown 
  onHorizontalDragEnd: myDragEnd, 
  onHorizontalDragStart: myDragStart, 
  onHorizontalDragUpdate: myDragUpdate, 
  onHorizontalDragCancel: myDragCancel, 
// Other fields…

#26238 移除長期棄用的 TwoLevelList

#

移除了長期棄用的 TwoLevelList 小部件;請使用帶有 ExpansionTile 的 ListView 代替。有關使用 ExpansionTile 的示例,請參閱此示例

####7442 將 Picture.toImage 光柵化移動到 GPU 執行緒

Picture.toImage 現在返回一個 Future<Image>。這允許影像光柵化在 GPU 執行緒上進行,從而在許多情況下提高效能並確保結果正確。至少,您需要將呼叫 Picture 例項的方法宣告為 async,並使用 await,如下所示:

dart
void usePictureImage(Picture p) async { 
  var image = await p.toImage(); 
  // Do something with the pixels in image…. 
}

但是,您的應用程式可能正在執行其他非同步操作,您應該考慮如何在此基礎上處理影像處理。有關 Dart 對非同步程式設計和 Future 類的支援的更多資訊,請參閱https://dart.lang.tw/tutorials/language/futures

#7567 重新命名 embedder.h 中的 FlutterResult

#

在 Embedder API 中,FlutterResult 型別已被重新命名為 FlutterEngineResult,以更好地說明其目的。您需要將以前的任何例項重新命名為後者。

#7414 Strut 實現

#

將 dart:ui ParagraphStyle.lineHeight 重新命名為 ParagraphStyle.height。ParagraphStyle.lineHeight 屬性以前不起作用,現已重新命名以保持與 TextStyle.height 一致。您需要將以前的任何例項重新命名為後者。

迴歸問題

#

在 1.2 版本釋出後不久,我們發現了兩個迴歸問題

  • #28640 NoSuchMethodError: android.view.MotionEvent.isFromSource

flutter/flutter#24830(“為滑鼠指標實現懸停支援。”)使用了 Android 4.1 上不存在的 Android API。這可能導致 Android 4.1 (Jellybean) 和 4.1 (Jellybean MR1) 崩潰。

  • #28484 自 Flutter 更新以來,小部件渲染異常

這可能導致在物理 iOS 裝置上載入某些影像時出現渲染問題。

要修復這些迴歸問題,一旦 3 月份 beta 1.3 版本釋出,您就可以切換到 beta 頻道,並在命令列執行“flutter upgrade”。在撰寫本文時,這將使您更新到至少 1.3.8 版本,其中包括 flutter/engine#8006(“防範使用 API 級別 16 和 17 中未定義的 Android API”)以及修復渲染問題的 Skia commit。對於崩潰問題,受影響的兩個 Android 版本已有十多年曆史,最多佔 Android 使用者總數的 2.5%,其中很少有人會安裝新的 Android 應用程式,無論是 Flutter 還是其他。儘管如此,我們仍然不希望在穩定版本中留下已知的迴歸問題,但在經過大量的內部討論後,我們認為這是 Flutter 開發者及其應用程式使用者的最佳處理方式。

我們對任何嚴重問題的理想解決方案是建立一個“熱修復”版本,透過獲取現有版本並“挑選”我們想要應用的修復程式。我們為 1.2 版本實現了對現有穩定版本進行熱修復的能力,但尚未達到生產質量。其後果是,如果我們建立了一個新的穩定版本“1.2.1-a”來修復迴歸問題,那麼我們將把所有使用者困在該分支上;更新到將來的分支將需要使用者從頭刪除並重新安裝 Flutter,這顯然是不可接受的。我們正在努力驗證我們在 1.3+ 中進行熱修復的能力,以免再次出現此問題。

另一種選擇是將 1.3 穩定釋出。我們目前的政策是每季度只發佈一個新穩定版本,以減少 Flutter 開發者的流失。在撰寫本文時,1.3 預穩定版本包含 104 個框架 commit(以及更多引擎、Dart 和 Skia commit),其中任何一個都可能影響您當前應用程式的執行方式。為了降低這種風險,我們將版本在 beta 中保留一個月,讓開發者進行測試,並在我們確信它們沒問題後才將其提升到穩定頻道。這就是我們維護季度釋出穩定性的方式。

我們的下一個穩定版本目前計劃在 2019 年 5 月釋出,這是第一個將包含此迴歸問題修復的穩定版本。如果您受到 #28640 的影響,並且認為使用預釋出版本 1.3 的解決方法不是您的選擇,請在 flutter/flutter#29235 上告知我們。同樣,如果您受到 #28484 的影響,請在 flutter/flutter/#29360 上告知我們。如果我們發現 Flutter 社群對我們在此問題上的決定有大量反饋,我們將利用您的反饋進行重新評估。畢竟,Flutter 是一個社群專案,您的意見很重要。

工具釋出

#

除了 Flutter 框架在 1.2 版本中的更改外,我們在同一時期還進行了許多工具釋出,您可以在此處閱讀相關資訊:

完整問題列表

#

您可以在此列表中檢視本次釋出中提交的完整 PR 列表