Navigator 頁面 API 重大變更
概述
#對 Navigator 頁面 API 進行了重構,以便它們能夠與 Flutter 的其他退出機制整合。
背景
#添加了 onPopPage 屬性,用於在頁面即將退出時進行清理。要阻止退出,您需要在回撥函式中返回 false。這與其他框架中的退出機制(例如 PopScope 和 iOS 返回手勢)配合不佳。
為了將框架的退出機制整合在一起,需要重構頁面 API。
變更說明
#onDidRemovePage 屬性取代了 onPopPage 屬性。您現在無法在 onDidRemovePage 屬性中阻止退出。相反,您只需負責更新 pages。
退出機制現在透過 Page.canPop 和 Page.onPopInvoked 屬性進行管理。這些屬性的功能類似於您使用 PopScope widget 的方式。
遷移指南
#遷移前的程式碼
dart
import 'package:flutter/material.dart';
final MaterialPage<void> page1 = MaterialPage<void>(child: Placeholder());
final MaterialPage<void> page2 = MaterialPage<void>(child: Placeholder());
final MaterialPage<void> page3 = MaterialPage<void>(child: Placeholder());
void main() {
final List<Page<void>> pages = <Page<void>>[page1, page2, page3];
runApp(
MaterialApp(
home: Navigator(
pages: pages,
onPopPage: (Route<Object?> route, Object? result) {
if (route.settings == page2) {
return false;
}
if (route.didPop) {
pages.remove(route.settings);
return true;
}
return false;
},
),
),
);
}遷移後的程式碼
dart
import 'package:flutter/material.dart';
final MaterialPage<void> page1 = MaterialPage<void>(child: Placeholder());
final MaterialPage<void> page2 = MaterialPage<void>(canPop: false, child: Placeholder());
final MaterialPage<void> page3 = MaterialPage<void>(child: Placeholder());
void main() {
final List<Page<void>> pages = <Page<void>>[page1, page2, page3];
runApp(
MaterialApp(
home: Navigator(
pages: pages,
onDidRemovePage: (Page<Object?> page) {
pages.remove(page);
},
),
),
);
}時間線
#已在版本中落地:3.22.0-32.0.pre
穩定版本:3.24.0
參考資料
#API 文件
相關議題
相關 PR