跳至主要内容

页面过渡由 ZoomPageTransitionsBuilder 替换

摘要

#

为了确保库遵循最新的 OEM 行为,默认页面过渡构建器现在在所有平台(不包括 iOS 和 macOS)上使用 ZoomPageTransitionsBuilder 而不是 FadeUpwardsPageTransitionsBuilder

上下文

#

FadeUpwardsPageTransitionsBuilder(随首个 Flutter 版本提供),定义了一个与 Android O 提供的页面过渡类似的页面过渡。根据 Flutter 的弃用策略,此页面过渡构建器最终将在 Android 上被弃用。

ZoomPageTransitionsBuilder 是 Android、Linux 和 Windows 的新的页面过渡构建器,它定义了一个与 Android Q 和 R 提供的页面过渡类似的页面过渡。

根据Flutter 代码库的样式指南,框架将遵循最新的 OEM 行为。使用 FadeUpwardsPageTransitionsBuilder 的页面过渡构建器都切换到 ZoomPageTransitionsBuilder。当当前 TargetPlatformThemeData.pageTransitionsTheme 中没有定义 PageTransitionsBuilder 时,ZoomPageTransitionsBuilder 将用作默认值。

更改说明

#

PageTransitionsTheme._defaultBuilders 中定义的 PageTransitionsBuilder 已从 FadeUpwardsPageTransitionsBuilder 更改为 ZoomPageTransitionsBuilder,适用于 TargetPlatform.androidTargetPlatform.linuxTargetPlatform.windows

迁移指南

#

如果要切换回以前的页面过渡构建器(FadeUpwardsPageTransitionsBuilder),则应为目标平台显式定义构建器。

迁移前的代码

dart
MaterialApp(
  theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple)),
)

迁移后的代码

dart
MaterialApp(
  theme: ThemeData(
    pageTransitionsTheme: const PageTransitionsTheme(
      builders: <TargetPlatform, PageTransitionsBuilder>{
        TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(), // Apply this to every platforms you need.
      },
    ),
  ),
)

如果要将相同的页面过渡构建器应用于所有平台

dart
MaterialApp(
  theme: ThemeData(
    pageTransitionsTheme: PageTransitionsTheme(
      builders: Map<TargetPlatform, PageTransitionsBuilder>.fromIterable(
        TargetPlatform.values,
        value: (dynamic _) => const FadeUpwardsPageTransitionsBuilder(),
      ),
    ),
  ),
)

测试迁移

#

如果您过去尝试查找小部件但使用新的过渡失败并出现“元素过多”错误,并看到了类似以下内容的错误

══╡ 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 作用域来迁移您的测试。以下是 DataTable 测试的示例

迁移前的测试

dart
final Finder finder = find.widgetWithIcon(Transform, Icons.arrow_upward);

迁移后的测试

dart
final Finder finder = find.descendant(
  of: find.byType(DataTable),
  matching: find.widgetWithIcon(Transform, Icons.arrow_upward),
);

通常需要迁移查找器作用域的小部件包括:TransformFadeTransitionScaleTransitionColoredBox

时间线

#

包含于版本:2.13.0-1.0.pre
稳定版本:3.0.0

参考

#

API 文档

相关问题

相关 PR