頁面過渡效果由 ZoomPageTransitionsBuilder 替換
概述
#為了確保庫遵循最新的 OEM 行為,預設的頁面過渡構建器現在將所有平臺(iOS 和 macOS 除外)的預設值從 FadeUpwardsPageTransitionsBuilder 更改為 ZoomPageTransitionsBuilder。
背景
#FadeUpwardsPageTransitionsBuilder(隨 Flutter 首次釋出提供)定義了與 Android O 提供的頁面過渡效果類似的頁面過渡。根據 Flutter 的棄用政策,此頁面過渡構建器最終將在 Android 上被棄用。
ZoomPageTransitionsBuilder 是 Android、Linux 和 Windows 的新頁面過渡構建器,它定義了一種與 Android Q 和 R 提供的頁面過渡效果類似的頁面過渡。
根據Flutter 倉庫的風格指南,框架將遵循最新的 OEM 行為。所有使用 FadeUpwardsPageTransitionsBuilder 的頁面過渡構建器都已切換到 ZoomPageTransitionsBuilder。噹噹前 TargetPlatform 在 ThemeData.pageTransitionsTheme 中沒有定義 PageTransitionsBuilder 時,將使用 ZoomPageTransitionsBuilder 作為預設值。
變更說明
#在 PageTransitionsTheme._defaultBuilders 中定義的 PageTransitionsBuilder 已從 FadeUpwardsPageTransitionsBuilder 更改為 ZoomPageTransitionsBuilder,適用於 TargetPlatform.android、TargetPlatform.linux 和 TargetPlatform.windows。
遷移指南
#如果您想切換回之前的頁面過渡構建器(FadeUpwardsPageTransitionsBuilder),您應該為目標平臺顯式定義構建器。
遷移前的程式碼
MaterialApp(
theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple)),
)遷移後的程式碼
MaterialApp(
theme: ThemeData(
pageTransitionsTheme: const PageTransitionsTheme(
builders: <TargetPlatform, PageTransitionsBuilder>{
TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(), // Apply this to every platforms you need.
},
),
),
)如果您想將相同的頁面過渡構建器應用於所有平臺
MaterialApp(
theme: ThemeData(
pageTransitionsTheme: PageTransitionsTheme(
builders: Map<TargetPlatform, PageTransitionsBuilder>.fromIterable(
TargetPlatform.values,
value: (dynamic _) => const FadeUpwardsPageTransitionsBuilder(),
),
),
),
)測試遷移
#如果您在使用新過渡效果時嘗試查詢 widget 但因“元素過多”而失敗,並看到類似以下的錯誤
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following StateError was thrown running a test:
Bad state: Too many elements
When the exception was thrown, this was the stack:
#0 Iterable.single (dart:core/iterable.dart:656:24)
#1 WidgetController.widget (package:flutter_test/src/controller.dart:69:30)
#2 main.<anonymous closure> (file:///path/to/your/test.dart:1:2)您應該透過為 Finder 使用 descendant 範圍並指定 widget 型別來遷移您的測試。下面是 DataTable 測試的示例
遷移前測試
final Finder finder = find.widgetWithIcon(Transform, Icons.arrow_upward);遷移後測試
final Finder finder = find.descendant(
of: find.byType(DataTable),
matching: find.widgetWithIcon(Transform, Icons.arrow_upward),
);通常需要遷移 finder 範圍的 widget 包括:Transform、FadeTransition、ScaleTransition 和 ColoredBox。
時間線
#包含於版本:2.13.0-1.0.pre
穩定版本:3.0.0
參考資料
#API 文件
相關問題
相關 PR