ページはデータ、UIはリゾルバで構築

PageEntry には最小限のメタデータだけを持たせ、buildPage で key ごとに画面を解決します。

シリアライズしやすい

ナビゲーション状態がプレーンデータになるため、ログ/再現が容易です。

明示的な分岐

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インスタンスを入れない ことで、責務分離とテスト容易性を維持できます。