跳至主要內容

路由與導航器重構

摘要

#

Route 類別不再於覆蓋層中管理其覆蓋層條目,且其 install() 方法不再有 insertionPoint 參數。RouteSetting 中的 isInitialRoute 屬性已被棄用,而 Navigator.pop() 不再傳回值。

情境

#

我們重構了導覽器 API,以準備新的頁面 API 和引入 Router 設計文件中概述的 Router 小部件。 此重構引入了一些函數簽名變更,以使現有的導覽器 API 能夠繼續與新的頁面 API 一起使用。

變更說明

#

Navigator.pop() 的布林傳回值未有明確定義,使用者可以透過呼叫 Navigator.canPop() 來達到相同的結果。由於 Navigator.canPop() 的 API 定義較佳,我們簡化了 Navigator.pop(),使其不再傳回布林值。

另一方面,導覽器需要能夠手動重新排列覆蓋層中的條目,以允許使用者在新 API 中變更路由歷史。我們變更了路由,使其僅建立和銷毀其覆蓋層條目,而導覽器則在覆蓋層中插入或移除覆蓋層條目。我們也移除了 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 以在新導航系統中繼續運作