Navigator 2.0を、状態から宣言的に駆動する。

declarative_nav は Navigator.push/pop や showDialog を直接呼ばずに、ページ配列とオーバーレイ要求を状態として扱うためのFlutterパッケージです。

ページはデータ

PageEntry は Widget 型を持ちません。画面の実体はリゾルバで生成します。

画面ローカルオーバーレイ

DialogやBottomSheetを (画面, タブ) 単位で管理でき、グローバル状態への依存を減らせます。

状態管理に非依存

setState / Riverpod / Bloc / Provider いずれでも同じ設計原則で運用できます。

最初の流れ

まず導入し、pages と overlay を状態として持つ形に移行します。

インストール

flutter pub add declarative_nav

導入イメージ

app_root.dart
class AppRootState extends State<AppRoot> {
  OverlayRequest? _overlay;
  late List<PageEntry> _pages;

  @override
  void initState() {
    super.initState();
    _pages = const [PageEntry(key: 'home', name: '/home')];
  }

  Widget build(BuildContext context) {
    return DeclarativePagesNavigator(
      pages: _pages,
      buildPage: _buildPage,
      onPopTop: _popTop,
      canPopTop: () => _overlay == null,
    );
  }
}
重要な設計ルール

同じスタックに対して 命令的(push/pop) と宣言的(List<PageEntry>) を混在させないでください。状態の単一責任を守るほど不具合が減ります。