2天前,Flutter發布了最新版本3.32,我們來一起看下29到32有哪些變化。
簡介
歡迎來到Flutter 3.32!此版本包含了旨在加速開發和增強應用程序的功能。準備好在網絡上進行熱加載,令人驚嘆的原生保真Cupertino,以及與Firebase強大的新AI集成。156位獨特貢獻者提交了1024次提交,其中包括39位首次貢獻者,Flutter 3.32證明了我們社區令人難以置信的工作。讓我們一起探索新事物吧!
Web
Web上的熱重載 (Beta)
我們很高興地宣布,你現在可以在Web上熱加載!Web對熱加載的支持是在Flutter跟蹤器上投票最多的第二大問題。我們很高興能給你一個機會在你自己的項目中試用它!我們需要您的幫助,以確保這個令人興奮的新功能有開發人員想要的一切。
如果您發現任何問題,使用Dart的Web Hot Reload問題模板提交錯誤。你可以在Web Hot Reload known issues GitHub項目上找到已知問題的列表。
現在是有趣的部分:如何使用這個功能
我們添加了一個簡單的命令行標志--web-experimental-hot-reload,你可以在任何地方調用flutter run。
使用VS Code 運行
如果您在VSCode 中使用調試配置,您可以添加這一項內容。
將配置添加到您的launch.json 文件中:
"configurations": [
…{"name": "Flutter for web (hot reloadable)","type": "dart","request": "launch","program": "lib/main.dart","args": ["-d","chrome","--web-experimental-hot-reload",]}
]
為獲得最佳效果,我們建議在VS Code 中啟用 “Dart: Flutter Hot Reload On Save”這一設置。也可以通過運行/調試面板中的?圖標來觸發熱重載。使用“?按鈕仍可觸發熱重啟。
命令行運行
如果您在命令行中使用 “flutter run” 命令,那么現在就可以通過以下命令進行熱重載操作了:
flutter run -d chrome --web-experimental-hot-reload
當熱重載功能開啟時,您可以在運行終端中通過按下“r”鍵來重新加載您的應用程序,或輸入“R”進行熱重啟。
在DartPad 中Reloading
現在,DartPad上也支持熱重載功能,新增了一個“Reload”按鈕。該功能僅在運行的應用程序中檢測到 Flutter時才可用。您可以使用 DartPad 提供的示例應用程序來試用此功能。
感謝您抽出時間幫助我們讓網絡上的“熱重載”功能變得如此出色!
Framework(架構)
我們一直在努力將邏輯從Material library轉移到 ?widgets library中。
此次更新引入了一款名為“可擴展”(Expansible)的新控件,它使得創建具有不同視覺主題的可展開和收縮的控件變得更加簡便。這款新控件是Material-styled的ExpansionTile底層構建模塊。
此次更新中還有一個非常有價值的新增功能RawMenuAnchor,由社區成員@davidhicks980 提供。這個小部件現已成為基礎構建模塊的Material-styled MenuAnchor,為創建具有不同視覺主題的菜單鋪平了道路。此外,RawMenuAnchor 也可以獨立使用,作為未加修飾的菜單,讓您完全掌控其外觀。
這樣的重構為諸如 Cupertino和 Material等設計語言的實現提供了更好的核心組件支持,同時還能實現更一致的界面設計和代碼復用。
Cupertino
Squircles(圓角:方圓形)
我們很高興向大家介紹 Flutter 中形狀功能的一項重大新改進:圓弧超橢圓(rounded superellipse)。
這種形狀常被稱為“Apple squircle(蘋果橢圓形)”,它是iOS設計語言的重要組成部分,因其曲線更加平滑且連貫,而不同于傳統的圓角矩形。Flutter 社區經常提出支持這種形狀的需求。它的加入代表了我們在為蘋果平臺提供具有原生外觀和感覺的高質量用戶界面方面所做出的又一努力。
CupertinoAlertDialog和 CupertinoActionSheet 兩者均已更新,采用了這種新的形狀!
您可以使用這些新的API 來為您的應用程序添加圓潤的超橢圓圖形:
- 用于繪畫或作為控件形狀使用的RoundedSuperellipseBorder
- 用于裁剪的 ClipRSuperellipse。
- Canvas.drawRSuperellipse、 Canvas.clipRSuperellipse 以及Path.addRSuperellipse 是針對底層API 的實現,它們提供了更直接的控制方式。
請注意,這種圓潤的超橢圓形狀仍在開發中。目前,它僅在iOS和Android 系統上可用,否則其表現將恢復為標準的圓角矩形。性能優化工作也在進行中。我們鼓勵您在考慮這些因素的情況下探索這一新功能,并期待在未來更新中提升其功能!
Sheet
Cupertino Sheet也解決了幾個問題,包括在Android上打開工作表時如何設置系統UI主題。
調整Sheet以固定導航條的高度,并確保內容不會在底部被切斷。下面的屏幕截圖演示了更改之前和之后的情況。
此版本中的其他修復包括工作表過渡與PopupMenuButton不兼容的問題,以及工作表的圓角過渡在更多設備上看起來正確。以前,它在一些具有不同角半徑的屏幕上看起來不正確。
你現在也可以在CupertinoSheetRoute和showCupertinoSheet上使用新的enableDrag參數來禁用Cupertino底部工作表的下拉解除行為。(#163923)
Navigation bars
CupertinoSliverNavigationBar.search。在打開或關閉搜索視圖時,搜索可以看到其動畫的保真度改進,以及搜索字段的前綴和后綴圖標的正確對齊。
https://miro.medium.com/v2/resize:fit:720/format:webp/0*R1tsiciz-w7OdOjr最后,帶有 CupertinoNavigationBars 或 CupertinoSliverNavigationBars 的頁面之間的切換已更新,以與最新的iOS 切換效果保持一致(#164956)。
Material
此次更新為Material庫帶來了多項功能增強和錯誤修復,從而提升了其功能性和開發者的使用體驗。
這些功能改進包括:
- CarouselController提供了更便捷的animateToIndex功能方法使得輪播圖能夠實現流暢的、基于索引的導航操作。
????????無論是使用固定大小的項目還是動態大小的項目,都可以通過flexWeights來進行設置。
- TabBar 現在具備了 onHover和 onFocusChange回調功能,這能讓您獲得更多操作選項。對小部件在不同狀態下的外觀進行控制。
- SearchAnchor 和 SearchAnchor.bar 現在分別包含了 viewOnOpen 和onOpen 回調函數,這使得能夠更好地觀察和處理打開/關閉事件。
- CalendarDatePicker現在支持設置一個calendarDelegate對象,以便能夠實現對格里高利歷系統之外的自定義日歷邏輯的集成。示例展示了這樣一個假設的日歷系統:偶數月份有21天,奇數月份有28天,并且每個月都從星期一開始,這展示了該委托對象所提供的靈活性。
其他一些小的改進包括:為 showDialog、showAdaptiveDialog 和 DialogRoute 添加了 animationStyle 屬性,以便在對話框打開和關閉時自定義動畫效果;Divider現在支持設置 borderRadius 屬性,從而能夠自定義分隔線的邊框,尤其是在分隔線較粗的情況下。
除了新增的功能之外,此次更新還解決了材料庫中DropdownMenu和Slider相關的若干bug問題:
- DropdownMenu 控件現在允許其菜單的寬度小于文本字段的寬度。示例已更新以解決之前出現的RenderFlex溢出錯誤。DropdownMenu的默認寬度現在會根據文本字段中的文本標簽的寬度進行調整。
- 當鼠標懸停在RangeSlider的指針上時,僅會顯示被懸停指針所覆蓋的部分。此前,兩個指針的覆蓋部分都會錯誤地顯示出來。現在,當軌道顏色透明時,Slider指針可以到達軌道的兩端,這解決了之前的一個限制,即它無法做到這一點。
無障礙
優化后的語義樹編譯
此功能將語義編譯時間縮短了約80%。在 Flutterfor web 中,啟用語義功能后,這相當于將幀時間縮短了30%。
介紹精細粒度的語義角色
一個新的SemanticsRoleAPI已被整合到Semantics控件及其相關組件中,為開發者提供了更精確地控制用戶輔助技術如何解讀用戶界面元素的能力。這一改進使得只需將整個控件樹包裹在已配置為特定語義的Semantics控件中,即可為其指定特定的語義角色。
官方的API 文檔中詳細列出了可用的角色列表。目前,這種高級語義角色功能僅適用于基于網絡的應用程序,而其他平臺的支持將在未來的版本中推出。
了解更多信息,請參閱《通過語義角色提升可訪問性》。
其他無障礙設施的改進措能
- 增強的用戶界面體驗與屏幕閱讀器支持:在各種小部件(包括文本字段、焦點處理、菜單、滑塊和下拉列表等)中提供了更出色的可訪問性和用戶體驗。舜幕閱讀器現在在用戶與這些元素進行交互時能提供更詳細的反飯。
- ’借助語義技術實現更流暢的網頁焦點導航:當啟用源義功能時,網頁焦點行為將得到優化,從而是著減少不同組件之間突然的焦點曉轉,為用戶提供更直觀的導航體驗。
- 改進了 Android TalkBack 的鏈接識別功能:Android TalkBack 現在能夠正確識別并播報使用語義定義的鏈接。包括使用 Semantics.linkUrl或url_launcher包中的Link組件所定義的鏈接。
-
在 Flutter 中為網頁添加 Windows 高對比度模式支持:引入了對Windows的“強制顏色”模式的支持(常用于高對比度場景)。開發者現在可以在ThemeData 中設置 useSystemColors 布爾值,以便自動將系統顏色應用到
Flutter 主題中,從而為依賴這些設置的用戶提高可見性。 - 優化的iOS 語音控制體驗:通過確保不可操作的小組件不再顯示不必要的標簽,提升了iOS 語音控制的用戶體驗,使用戶的操作更加簡潔、專注。
文本輸入
此次更新中,文本輸入功能有了多項改進:
- 在iOS 系統中啟動了系統文本選擇上下文菜單,相關內容請見下文的iOS部分。
- Autocomplete控件的選項布局已被移植到OverlayPortal中,這不僅提高了性能,還解決了布局方面的缺陷。
- 現在可以對文本字段中的onTapUpOutside行為進行自定義了(#162575)。
- 現在,開發人員可以為FormField生成任何他們想要的自定義控件作為錯誤消息,而不再只是簡單的錯誤文本(#162255)。
- 在Flutter 中,可選文本的bug問題有所減少?(#162228),并且在網頁端的性能也有所提升?(#161682)。
多窗口支持方面的進展
來自 Canonical 公司的開發人員在實現桌面應用程序支持多窗口功能方面取得了顯著進展
Canonical 已修復了在應用程序存在多個窗口時出現的若干故障問題:
- 可訪問性:#164577
- 應用生命周期通知:#164872
- 重點:#164296
- 鍵盤事件:?#162131,?#163962
- 文本輸入:#163847,?#164014
- 鼠標事件:#163855
Canonical 還新增了一項功能,使得 Dart 代碼的 FFI (Foreign Function Interface,即外部函數接口)能夠直接與 Flutter 引擎進行通信?(#163430)。這 Flutter 未來的窗口API 構建奠定了基礎。
最后,Canonical 在 Linux 系統中引入了raster thread?(#161879)。這提高了幀的傳輸速度,確保了即使您打開了多個窗口,Flutter 在 Linux 系統中的運行依然流暢順滑。
桌面線程合并
Canonical 還對Windows 和 macOS 系統進行了更折,使得應用能夠將 UI和平臺線程合井起來(相關問題編號:#162883,?#162935)。
合并線程使您能多使用 Dart FFI 與必須在平臺線理上調用的原生AP1進行交互。例如,如果在 Windows 上點用了合并線猩,您就可以使用 Dart FFl 通過 win32 API 適配開發
在 Windows系總中,您可以造過在 windows/runner/main.cpp文件中的wwinMain”方法內添加以下代來啟用合井線程:
project.set_ui_thread_policy(UIThreadPolicy::RunOnPlatformThread)
在 macOS 系統中,您可以通過在macos/Runnes/info.plist?文件中的<dict>元素內添加以下內容來啟用合并線程:
<key>FLTEnableMergedPlatformUIThread</key>
<true />
在來來的版本中,我們將在 Windows和 macOS 系統上默認開啟合并線釋功能,請嘗試一下,并在遇到任何問題時提交相關 bug 報告!
ios
我們在iOS 平臺上對 Flutter 應用程序的粘貼功能進行了優化!對于那些沒有自定義操作的基本文本字段,用戶在從其他應用程序粘貼內容時將不再看到確認對話框。此功能在所有FlutterioS 應用程序中默認已啟用。請注意,如果您的應用程序使用了自定義操作(例如:在菜單中“發送電子郵件”)此功能目前尚不支持。
Android
對 Gradle 工具進行的 Kotlin 語言重寫
Flutter 的Gradle 插件已從 Groovy語言轉換為 Kotlin語言。這一從 Groovy 到Kotlin 的轉變使得代碼庫更易于進行貢獻,并且也有助于為該插件引入單元測試。新增的測試以及從動態類型和動態執行的語言轉換為靜態類型語言,應該會為Flutter開發者帶來更穩定和可靠的構建過程。我們不期望此次重寫會導致任何行為上的變化,所以如果您發現 Android 構建與預期不符,請提交一個問題。
書寫板/觸控筆支持
現在,您可以用觸控筆在安卓設備上的文本字段中進行書寫,其方式與蘋果手寫筆在 FlutterioS 應用中的手寫輸入功能相同。用戶可以直接在任何 Flutter文本輸入字段上開始書寫,手寫內容將會以文本形式顯示在該字段中。目前并非所有手勢都得到支持,但我們正在努力填補這些空白。此功能僅在 Android 14及以上版本中可用,并且如果需要,可以通過 TextField.stylusHandwritingEnabled或CupertinoTextField.stylusHandwritingEnabled
設置。
Engine
安卓系統上的Impeller
從 3.29.3版本開始,在運行 Android API級別為28(即 Android 9)及更低版本的設備上,Flutter 應用將使用傳統的 Skia 渲染器。這一改變提高了 Flutter 在較舊日的Android設備上的穩定性。而Impeller 則繼續作為運行 API級別為29(即 Android10)及更高版本設備的默認渲染器。
隨著我們從使用不同設備的用戶那里獲得更多的反饋,我們已經調整了哪些設備使用
Impeller 的 Vulkan 后端,而哪些設備使用 OpenGLES 后端。特別地,在此次更新中,以下設備將使用 OpenGLES 而非 Vulkan:Android 模擬器、API版本小于31的聯發科技設備、CXT 之前的 PowerVR 設備,以及不支持 Vulkan 1.3的三星 XClipse GPU的較舊版本。
與之前的版本一樣,您可以通過以下步驟選擇退出使用Impeller。鑒于我們對Impeller穩定性和性能的愈發信任,未來的一個穩定版本中,將不再提供在新款安卓設備上退出使用Impeller的選項。
最后,Flutter 3.27版本存在一些與在支持Vulkan的設備上使用Impeller 渲染相關的渲染錯誤和崩潰問題,這些問題在 3.29及更高版本中已得到解決。我們不打算將這些更改直接應用于3.27版本,強烈建議您升級到3.29或更高版本。如果您的應用程序無法進行升級,我們建議在安卓設備上禁用Impeller 功能。
其他Impeller更新
此次更新提升了Impeller的文本渲染效果。尤為值得一提的是,得益于Impeller字體圖集中的更高分辦率字體,文本動畫變得更加流暢,抖動現象也明顯減少,并且還解決了浮點運算中的四舍五入誤差問題。更多詳情請參見?flutter#149652.
此次發布還包含了多種其他音質和性能方面的內容。
改進措施,包括:
- 圓錐曲線不再進行近似處理,而是直接進行分塊分割。
- 部分重繪已得到優化,以避免頻繁進行內存分配。
- 模糊效果的處理速度得到了提升,這是因為去除了不必要的附加組件。
- 文本的固定方向已精確旋轉了180度。
DevTools and IDEs
[新功能]Flutter屬性編輯器
可以輕松編輯小部件屬性,并通過新的“屬性編輯器”工具閱讀相關文檔。該工具可通過 Flutter 屬性編輯器側邊欄面板(在VS Code 中)或工具窗口(在 AndroidStudio 或IntelliJ中)訪問。
DevTools改進
在 DevTools 中還進行了多項改進,包括為網絡界面新增了離線支持功能、修復了與審查歷史、檢查器錯誤、深度鏈接工具以及 CPU分析器和內存界面的數據相關的問題,并對數據進行了優化。此次更新還為DevTools 增加了多項性能和內存方面的改進,這將使數據加載速度更快,減少與內存相關的崩潰情況。
這只是此次發布的一些重點內容。如需了解 Flutter3.32中包含的所有更新內容,請查閱 DevTools 的發布說明2.44.0和2.45.0。
Analyzer改進
我們一直在對Dart分析器進行改進,從而優化了開發者的使用體驗。這包括新增了“文檔導入”功能,這是一種基于注釋的語法,使得在文檔注釋中能夠引用外部元素,而無需實際進行導入操作。詳情請查看dart.dev。此外,我們還對快速修復、輔助功能和重命名功能進行了多項改進。
在 Android Studio 中,Gemini 現在能夠流暢地使用 Flutter和 Dart 語言了。
在Android Studio 中,Gemini 現已為 Dart 和 Flutter 開發提供了頂級支持!這意味著您可以在您所喜愛的集成開發環境(IDE)中直接利用Gemini 的強大功能,從而以比以往更快、更簡便的方式構建美觀且高性能的 Flutter 應用程序。
博客鏈接:博客鏈接
https://miro.medium.com/v2/resize:fit:720/format:webp/1*51UZbL3Qb7BGDEuujTTg6A.gif
對于模型上下文協議 (MCP)的支持,Dart 和 Flutter 已經即將推出。
對于模型上下文協議(MCP)以及近期發布的Dart MCP SDK的支持工作正在積極推進中。同時,一個新的 Dart Tooling?MCP Server也正在開發中,該服務器將向MCP 客戶端(如集成開發環境)開放Dart 和 Flutter 的靜態、運行時以及生態系統工具功能。
這將為 Dart和 Flutter 開發者帶來以下好處:
- 更準確且更具針對性的代碼生成。
- 復雜的任務—一比如解決布局問題、管理依賴關系,甚至解決運行時錯誤一一都變得可行了,這是因為MCP 協議能夠從實際的 Dart和 Flutter 工具中獲取語義信息。
敬請關注!
Build with AI
介紹 Firebase Al邏輯
您可能聽說過,或者甚至已經在 Firebase 中使用過 Vertex Al。Firebase 是我們為將Gemini API驅動的功能直接集成到您的 Flutter 應用程序中而開發的客戶端SDK。
許多用戶要求使用“Gemini Developer API”而非 “Vertex A”,以便利用豐厚的免費套餐,并以零成本開始添加生成式人工智能功能。我們聽到了你們的訴求!從今天起,我們將
Vertex Al 在 Firebase 中進行升級,將其轉變為 Firebase AI 邏輯,這樣只需一個 FlutterSDK就能訪問到Gemini API 的兩個提供者。這使得您能夠直接從 Flutter 應用程序中使用Gemini 和“Imagen” 模型,而無需使用服務器端SDK。
請查看 firebase_ai 包以了解新功能。如果您已經在使用 firebase_vertexai包,那么目前它仍能保持原樣運行,但我們鼓勵您遷移到新的包版本。
借助 AI 監控儀表盤獲取可操作的見解
Firebase 控制臺中的新 AI 監控儀表板能夠為您提供有關 Gemini API 使用情況的詳細且具有實際意義的洞察。這包括對使用模式、性能指標以及潛在問題的全面了解。這有助于您做出基于數據的決策,并確保您以最高效的方式使用 Gemini APl。AI 監控還能幫助您調試 GeminiAPI的使用情況,并識別和解決任何意外行為。
打破變更和棄用
安卓無障礙功能公告
在安卓系統中,自API 36版本起,語義公告事件已被棄用。相反,可以通過配置 SemanticProperties.liveRegion 來使用“polite”的隱式通知,目前,在宣布不應具有焦點的文本時存在一個已知的限制。有關此限制的詳組估息以及解決此問題的計劃,請參閱問題 #165857?。要查看其他解決方案,請查閱關于SemanticService.announce ,
停止對6個軟件包的支持
正如我們在 Flutter 3.29版本發布博客文章中所計劃和閱述的那樣,我們已停止對以下包的支持:
flutter_markdown
; see?flutter_markdown planned to be discontinued #162966ios_platform_images
; see?ios_platform_images planned to be discontinued #162961css_colors
; see?css_colors planned to be discontinued #162962palette_generator
; see?palette_generator planned to be discontinued #162963flutter_image
; see?flutter_image discontinued #162964flutter_adaptive_scaffold
; see?flutter_adaptive_scaffold planned to be discontinued #162965
我們鼓助社區成員參考每個議題中的討論內容,以獲取其他可行的解決方案。
iOS和 macOS的最低版本要求
在下一次穩定版本發布中,Flutter 將停止對iOS12和 macos 10.14(莫卡維)的支持,并將把最低運行要求設定為iOS 13和 macOS 10.15(塔卡琳)。這意味著基于未來版本的Flutter 構建的應用程序將無法在iOS 12或 macOS 10.14上運行。
其他重大變更
本次更新中還有其他一些重大變更和棄用內容包括:
- 在 Material 中,已棄用 “ExpansionTileController”組伴,轉而采用位于 Widgets層中的新的可復用 “ExpansibleController”組件。
- 將 “SelectionChangedCause.scribble”(已棄用)重命名為“
SelectionChangedCause.stylusHandwriting”,因為蘋果的“繪圖”功能現已與安卓的“書寫板”功能統一了。 - 作為我們持緩推進材料主題化標準化工作的一部分,ThemeDatarindicatorColor 已被棄用,取而代之的是TabBarThemeData.indicatorColor。同時,cardTheme、dialogTheme 和 tabBarTheme 的組件主題類型需要分別遷移到CardThemeData. DialogThemeData?,TabBarThemeData?。
- 在某些行為中,SpringDescription 的公式已得到修正。這一改動解決了這樣一個問題:對于某些參數組合,該行為與預期的真實物理現象不符,并且在臨界阻尼點附近會出現不連續現象。這種破壞性影響到欠阻尼彈簧(陰尼比小于1) 以及質量值并非1的其他情況。在此更改之前創建的此類彈簧在升級后可能會表現出不同的彈跳行為。要恢復之前的動畫行為,請根據“欠阻尼彈簧的破壞性更改說明”更新您的彈簧參數,您還可以在該指南中找到用于計算參數調整的工具。
要查看本版本中所有已棄用功能或重大變更的遷移指南,請訪問“重大變更???????”頁面。更新后運行 “dart fix”命令將自動為您遷移部分此類變更。
結論
Flutter 3.32 進一步實現了突破,這得益于我們社區的不懈努力。我們非常高興能為您帶來諸如網頁熱重載等新功能以及持續的平臺改進。您的貢獻至關重要,我們迫不及待地想看到您所創造的成果。如需全面了解詳情,請查看詳細的發行說明和變更日志。要開始使用,請直接運行 “flutter upgrade”并進入最新版本!