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>) を混在させないでください。状態の単一責任を守るほど不具合が減ります。