路由轉換記錄和轉換委託更新
摘要
#在路由轉換記錄中新增了一個新的布林值 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。 檢視原始碼 或回報問題。