可序列化的狀態
PageEntry 是純資料,因此導覽狀態可以記錄、比較,並重新播放。
簡單的解析器
在 page.key 上使用 switch,能讓路由保持明確且可檢視。
單一真實來源
Push 和 pop 只是對 _pages 清單的操作,不是副作用。
解析器模式
依頁面鍵建構,並以宣告式方式變更頁面清單。
頁面狀態規則
解析器範例
Widget _buildPage(BuildContext context, PageEntry page) {
switch (page.key) {
case 'home':
return HomePage(onGoDetail: _goDetail);
case 'detail':
return const DetailPage();
default:
return const SizedBox.shrink();
}
}
void _goDetail() {
setState(() => _pages = [..._pages, const PageEntry(key: 'detail', name: '/detail')]);
}
讓中繼資料保持精簡
避免將 Widget 實例 Widget 實例放入導覽狀態中,並讓 PageEntry 保持為純中繼資料,以利維護。