路由过渡记录和过渡委托更新
摘要
#路由过渡记录中添加了一个新的布尔型 getter `isWaitingForExitingDecision`,并且 `isEntering` getter 重命名为 `isWaitingForEnteringDecision`。在过渡委托的 `resolve()` 方法中,使用 `isWaitingForExitingDecision` 检查退出路由是否确实需要关于如何从屏幕上过渡的明确决策。如果尝试为不等待决策的现有路由做出决策,Flutter 会抛出断言错误。
上下文
#当导航器接收到新的页面列表时,它会尝试更新其当前路由栈以匹配该列表。但是,它需要关于如何将路由切换到屏幕上和屏幕外的明确决策。以前,不在新列表中的路由需要关于如何从屏幕上过渡的决策。但是,我们后来发现这并不总是正确的。如果一个路由被弹出,但仍在等待弹出动画完成,则此路由将保留在导航器路由栈中,直到动画完成。如果在此期间发生页面更新,则此路由退出,但不需要关于如何从屏幕上过渡的决策。因此,添加了 `isWaitingForExitingDecision` 来处理这种情况。
`isEntering` getter 也重命名为 `isWaitingForEnteringDecision` 以使其更具描述性,并且使命名更一致。
迁移指南
#如果实现自己的过渡委托,则需要在调用 `markForPop`、`markForComplete` 或 `markForRemove` 之前,使用 getter `isWaitingForExitingDecision` 检查退出路由。还需要将所有对 `isEntering` 的引用重命名为 `isWaitingForEnteringDecision`。
迁移前的代码
import 'package:flutter/widgets.dart';
class NoAnimationTransitionDelegate extends TransitionDelegate<void> {
@override
Iterable<RouteTransitionRecord> resolve({
List<RouteTransitionRecord> newPageRouteHistory,
Map<RouteTransitionRecord, RouteTransitionRecord> locationToExitingPageRoute,
Map<RouteTransitionRecord, List<RouteTransitionRecord>> pageRouteToPagelessRoutes,
}) {
final List<RouteTransitionRecord> results = <RouteTransitionRecord>[];
for (final RouteTransitionRecord pageRoute in newPageRouteHistory) {
if (pageRoute.isEntering) {
pageRoute.markForAdd();
}
results.add(pageRoute);
}
for (final RouteTransitionRecord exitingPageRoute in locationToExitingPageRoute.values) {
exitingPageRoute.markForRemove();
final List<RouteTransitionRecord> pagelessRoutes = pageRouteToPagelessRoutes[exitingPageRoute];
if (pagelessRoutes != null) {
for (final RouteTransitionRecord pagelessRoute in pagelessRoutes) {
pagelessRoute.markForRemove();
}
}
results.add(exitingPageRoute);
}
return results;
}
}
迁移后的代码
import 'package:flutter/widgets.dart';
class NoAnimationTransitionDelegate extends TransitionDelegate<void> {
@override
Iterable<RouteTransitionRecord> resolve({
List<RouteTransitionRecord> newPageRouteHistory,
Map<RouteTransitionRecord, RouteTransitionRecord> locationToExitingPageRoute,
Map<RouteTransitionRecord, List<RouteTransitionRecord>> pageRouteToPagelessRoutes,
}) {
final List<RouteTransitionRecord> results = <RouteTransitionRecord>[];
for (final RouteTransitionRecord pageRoute in newPageRouteHistory) {
// Renames isEntering to isWaitingForEnteringDecision.
if (pageRoute.isWaitingForEnteringDecision) {
pageRoute.markForAdd();
}
results.add(pageRoute);
}
for (final RouteTransitionRecord exitingPageRoute in locationToExitingPageRoute.values) {
// Checks the isWaitingForExitingDecision before calling the markFor methods.
if (exitingPageRoute.isWaitingForExitingDecision) {
exitingPageRoute.markForRemove();
final List<RouteTransitionRecord> pagelessRoutes = pageRouteToPagelessRoutes[exitingPageRoute];
if (pagelessRoutes != null) {
for (final RouteTransitionRecord pagelessRoute in pagelessRoutes) {
pagelessRoute.markForRemove();
}
}
}
results.add(exitingPageRoute);
}
return results;
}
}
时间线
#包含在版本中:1.18.0
稳定版发布:1.20
参考文献
#API 文档
相关问题
相关 PR
- PR 55998:修复当仍有路由等待时导航器页面更新崩溃的问题
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面上次更新于 2024-04-04。 查看源代码 或 报告问题.