跳至主要内容

Navigator 页面 API 更改

摘要

#

The 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