跳至主要內容

導覽器的頁面 API 變更

摘要

#

Navigator頁面 API已重構,以便它們可以與 Flutter 的其他彈出機制整合。

背景

#

新增了 onPopPage 屬性,用於在頁面即將被彈出後進行清理。若要阻止彈出,您可以在回呼函式中返回 false。但這個機制與框架中其他彈出機制(例如 PopScope 和 iOS 返回手勢)配合不佳。

為了整合框架的彈出機制,需要重構頁面 API。

變更說明

#

onDidRemovePage 屬性取代了 onPopPage 屬性。您無法再在 onDidRemovePage 屬性中阻止彈出。相反地,您僅需負責更新 pages

現在,阻止彈出的機制由 Page.canPopPage.onPopInvoked 屬性管理。這些屬性的運作方式與您使用 PopScope 小工具類似。

遷移指南

#

遷移前的程式碼

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