概述

#

Route 类不再管理其在 overlay 中的 overlay 条目,并且其 install() 方法不再包含 insertionPoint 参数。RouteSetting 中的 isInitialRoute 属性已被弃用,并且 Navigator.pop() 不再返回值。

背景

#

我们重构了导航器 API,为新的页面 API 和 Router 设计文档中概述的 Router 组件的引入做准备。此次重构引入了一些函数签名更改,以使现有的导航器 API 能够继续与新的页面 API 配合使用。

变更说明

#

Navigator.pop() 的布尔返回值定义不明确,用户可以通过调用 Navigator.canPop() 实现相同的结果。由于 Navigator.canPop() 的 API 定义更清晰,我们将 Navigator.pop() 简化为不再返回布尔值。

另一方面,导航器需要能够在 overlay 中手动重新排列条目,以允许用户在新的 API 中更改路由历史。我们做了更改,现在路由只创建和销毁其 overlay 条目,而导航器负责从 overlay 中插入或移除 overlay 条目。我们还移除了 Route.install()insertionPoint 参数,因为在更改后它已过时。

最后,作为重构的一部分,我们从 RouteSetting 中移除了 isInitialRoute 属性,并提供了 onGenerateInitialRoutes API 以完全控制初始路由的生成。

迁移指南

#

情况 1:应用依赖于 pop() 返回布尔值。

dart
TextField(
  onTap: () {
    if (Navigator.pop(context))
      print('There still is at least one route after pop');
    else
      print('Oops! No more routes.');
  }
)

您可以使用 Navigator.canPop() 结合 Navigator.pop() 来达到相同的结果。

dart
TextField(
  onTap: () {
    if (Navigator.canPop(context))
      print('There still is at least one route after pop');
    else
      print('Oops! No more routes.');
    // Our navigator pops the route anyway.
    Navigator.pop(context);
  }
)

情况 2:应用根据 isInitialRoute 生成路由。

dart
MaterialApp(
  onGenerateRoute: (RouteSetting setting) {
    if (setting.isInitialRoute)
      return FakeSplashRoute();
    else
      return RealRoute(setting);
  }
)

有多种方式可以迁移此更改。一种方法是为 MaterialApp.initialRoute 设置一个明确的值。然后,您可以测试此值来替代 isInitialRoute。由于 initialRoute 的默认值继承自 Flutter 范围之外,您必须为其设置一个明确的值。

dart
MaterialApp(
  initialRoute: '/', // Set this value explicitly. Default might be altered.
  onGenerateRoute: (RouteSetting setting) {
    if (setting.name == '/')
      return FakeSplashRoute();
    else
      return RealRoute(setting);
  }
)

如果存在更复杂的用例,您可以在 MaterialAppCupertinoApp 中使用新的 API onGenerateInitialRoutes

dart
MaterialApp(
  onGenerateRoute: (RouteSetting setting) {
    return RealRoute(setting);
  },
  onGenerateInitialRoutes: (String initialRouteName) {
    return <Route>[FakeSplashRoute()];
  }
)

时间线

#

发布版本: 1.16.3
稳定版本: 1.17

参考资料

#

设计文档

API 文档

相关议题

相关 PR

  • PR 44930 - 重构命令式 API 以在新导航系统中继续工作