概述

#

根據 Flutter 的棄用策略,已於 3.10 穩定版釋出後生命週期結束的棄用 API 已被移除。

所有受影響的 API 都已彙集在此處,以協助遷移。同時還提供了一個快速參考表

變更

#

本節按軟體包和受影響的類列出了棄用項。

ThemeData.fixTextFieldOutlineLabel

#

軟體包:flutter Flutter Fix 支援:是

ThemeData.fixTextFieldOutlineLabel 在 v2.5 中已棄用。可以移除對此屬性的引用。

fixTextFieldOutlineLabel 是一個臨時的遷移標誌,允許使用者平滑地遷移到新的行為,而不是遇到硬性中斷。在棄用之前,此屬性已從文字欄位標籤的修復遷移到新的預設值。

遷移指南

遷移前的程式碼

dart
var themeData = ThemeData(
  fixTextFieldOutlineLabel: true,  
);

遷移後的程式碼

dart
var themeData = ThemeData(
);

參考資料

API 文件

相關 PR


OverscrollIndicatorNotification.disallowGlow

#

軟體包:flutter Flutter Fix 支援:是

OverscrollIndicatorNotification.disallowGlow 在 v2.5 中已棄用。替代方法是 disallowIndicator 方法。

引入 StretchingOverscrollIndicator 時,建立了 disallowIndicator 作為原始方法的替代。以前,GlowingOverscrollIndicator 是唯一分發 OverscrollIndicatorNotification 的型別,因此該方法已更新,以更好地反映多種指示器型別。

遷移指南

遷移前的程式碼

dart
bool _handleOverscrollIndicatorNotification(OverscrollIndicatorNotification notification) {
  notification.disallowGlow();
  return false;
}

遷移後的程式碼

dart
bool _handleOverscrollIndicatorNotification(OverscrollIndicatorNotification notification) {
  notification.disallowIndicator();
  return false;
}

參考資料

API 文件

相關 PR


ColorScheme primaryVariant & secondaryVariant

#

軟體包:flutter Flutter Fix 支援:是

ColorScheme.primaryVariantColorScheme.secondaryVariant 在 v2.6 中已棄用。它們分別被 ColorScheme.primaryContainerColorScheme.secondaryContainer 替代。

這些更改是為了與更新的 Material Design 規範對 ColorScheme 的要求保持一致。關於 ColorScheme 的更新在Material 3 的 ColorScheme 設計文件中有更詳細的介紹。

遷移指南

遷移前的程式碼

dart
var colorScheme = ColorScheme(
  primaryVariant: Colors.blue,
  secondaryVariant: Colors.amber,
);
var primaryColor = colorScheme.primaryVariant;
var secondaryColor = colorScheme.secondaryVariant;

遷移後的程式碼

dart
var colorScheme = ColorScheme(
  primaryContainer: Colors.blue,
  secondaryContainer: Colors.amber,
);
var primaryColor = colorScheme.primaryContainer;
var secondaryColor = colorScheme.secondaryContainer;

參考資料

設計文件

API 文件

相關 PR


ThemeData.primaryColorBrightness

#

軟體包:flutter Flutter Fix 支援:是

ThemeData.primaryColorBrightness 在 v2.6 中已棄用,並且自那時起框架就未使用過它。應移除相關引用。現在,如果未顯式提供 ThemeData.brightness,則 Brightness 會從 ThemeData.primaryColor 推斷出來。

此更改是為了更新 Theme 以匹配新的 Material Design 指南。關於 theaming 系統的整體更新,包括 primaryColorBrightness 的移除,在Material 主題系統更新設計文件中有更詳細的討論。

遷移指南

遷移前的程式碼

dart
var themeData = ThemeData(
  primaryColorBrightness: Brightness.dark,
);

遷移後的程式碼

dart
var themeData = ThemeData(
);

參考資料

設計文件

API 文件

相關 PR


RawScrollbar & 子類更新

#

軟體包:flutter Flutter Fix 支援:是

RawScrollbarScrollbarScrollbarThemeDataCupertinoScrollbarisAlwaysShown 屬性在 v2.9 中已棄用。在所有情況下,替代屬性都是 thumbVisibility

此更改之所以做出,是因為 isAlwaysShown 始終指向捲軸的 thumb。隨著捲軸 track 的新增,以及其在響應滑鼠懸停和拖動時的可見性配置的多樣化,我們重新命名了此屬性以提供更清晰的 API。

此外,Scrollbar.hoverThickness 在 v2.9 中也已棄用。它的替代是 MaterialStateProperty ScrollbarThemeData.thickness

此更改是為了讓 Scrollbar 的 thickness 能夠響應所有型別的狀態,而不僅僅是懸停。使用 MaterialStateProperties 也符合 material 庫中基於狀態配置 widget 的約定,而不是為每種互動狀態的排列列舉屬性。

遷移指南

遷移前的程式碼

dart
var rawScrollbar = RawScrollbar(
  isAlwaysShown: true,
);
var scrollbar = Scrollbar(
  isAlwaysShown: true,
  hoverThickness: 15.0,
);
var cupertinoScrollbar = CupertinoScrollbar(
  isAlwaysShown: true,
);
var scrollbarThemeData = ScrollbarThemeData(
  isAlwaysShown: true,
);

遷移後的程式碼

dart
var rawScrollbar = RawScrollbar(
  thumbVisibility: true,
);
var scrollbar = Scrollbar(
  thumbVisibility: true,
);
var cupertinoScrollbar = CupertinoScrollbar(
  thumbVisibility: true,
);
var scrollbarThemeData = ScrollbarThemeData(
  thumbVisibility: true,
  thickness: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
    return states.contains(MaterialState.hovered) ? null : 15.0;
  }),
);

參考資料

API 文件

相關 PR


AnimationSheetBuilder display & sheetSize

#

包:flutter_test 由 Flutter Fix 支援:是

AnimationSheetBuilderdisplaysheetSize 方法在 v2.3 中已棄用。替代方法是 collate 方法。

AnimationSheetBuilder 的輸出步驟以前需要呼叫這兩個方法,但現在透過呼叫 collate 單次呼叫即可完成。

collate 函式直接組合影像,並非同步返回一個影像。它需要更少的樣板程式碼,並輸出更小的影像,而不會犧牲質量。

遷移指南

提供了詳細的遷移指南

遷移前的程式碼

dart
final AnimationSheetBuilder animationSheet = AnimationSheetBuilder(
    frameSize: const Size(40, 40)
);

await tester.pumpFrames(animationSheet.record(
  const Directionality(
    textDirection: TextDirection.ltr,
    child: Padding(
      padding: EdgeInsets.all(4),
      child: CircularProgressIndicator(),
    ),
  ),
), const Duration(seconds: 2));

tester.binding.setSurfaceSize(animationSheet.sheetSize());

final Widget display = await animationSheet.display();
await tester.pumpWidget(display);

await expectLater(
  find.byWidget(display),
  matchesGoldenFile('material.circular_progress_indicator.indeterminate.png'),
);

遷移後的程式碼

dart
final AnimationSheetBuilder animationSheet = AnimationSheetBuilder(
    frameSize: const Size(40, 40)
);

await tester.pumpFrames(animationSheet.record(
  const Directionality(
    textDirection: TextDirection.ltr,
    child: Padding(
      padding: EdgeInsets.all(4),
      child: CircularProgressIndicator(),
    ),
  ),
), const Duration(seconds: 2));

await expectLater(
  animationSheet.collate(20),
  matchesGoldenFile('material.circular_progress_indicator.indeterminate.png'),
);

參考資料

API 文件

相關 PR



flutter_test 超時邏輯

#

包:flutter_test 由 Flutter Fix 支援:否

在 v2.6 中,與測試中的超時邏輯相關的以下 API 已被棄用。沒有替代方法,應移除相關引用,但 testWidgetsinitialTimeout 引數除外,它已被使用 timeout 替代。

  • TestWidgetsFlutterBinding.addTime
  • TestWidgetsFlutterBinding.runAsync 方法 - additionalTime 引數
  • TestWidgetsFlutterBinding.runTest 方法 - timeout 引數
  • AutomatedTestWidgetsFlutterBinding.runTest 方法 - timeout 引數
  • LiveTestWidgetsFlutterBinding.runTest 方法 - timeout 引數
  • testWidgets 方法 - initialTime 引數

這些 API 被發現會導致測試不穩定,並且未被已測試的客戶使用。

自棄用以來,使用這些引數對測試沒有影響,因此移除相關引用應對現有程式碼庫沒有影響。

遷移指南

遷移前的程式碼

dart
testWidgets('Test', (_) {}, initialTimeout:  Duration(seconds: 5));

遷移後的程式碼

dart
testWidgets('Test', (_) {}, timeout:  Timeout(Duration(seconds: 5)));

參考資料

API 文件

相關 PR


時間線

#

在穩定版中釋出: 3.13.0