路由與導航器重構
摘要
#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()
傳回布林值。
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()
來達到相同的結果。
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
生成路由。
MaterialApp(
onGenerateRoute: (RouteSetting setting) {
if (setting.isInitialRoute)
return FakeSplashRoute();
else
return RealRoute(setting);
}
)
有多種方法可以遷移此變更。一種方法是為 MaterialApp.initialRoute
設定明確的值。然後,您可以測試此值來取代 isInitialRoute
。由於 initialRoute
在 Flutter 範圍之外繼承其預設值,因此您必須為其設定明確的值。
MaterialApp(
initialRoute: '/', // Set this value explicitly. Default might be altered.
onGenerateRoute: (RouteSetting setting) {
if (setting.name == '/')
return FakeSplashRoute();
else
return RealRoute(setting);
}
)
如果存在更複雜的用例,您可以在 MaterialApp
或 CupertinoApp
中使用新的 API onGenerateInitialRoutes
。
MaterialApp(
onGenerateRoute: (RouteSetting setting) {
return RealRoute(setting);
},
onGenerateInitialRoutes: (String initialRouteName) {
return <Route>[FakeSplashRoute()];
}
)
時間軸
#已於版本中實作:1.16.3
穩定版本:1.17
參考資料
#設計文件
API 文件
相關問題
相關 PR
- PR 44930 - 重構命令式 API 以在新導航系統中繼續運作
除非另有說明,否則本網站上的文件反映了 Flutter 的最新穩定版本。頁面上次更新時間為 2024-04-04。 檢視原始碼 或 回報問題。