Страницы как данные, UI через резолвер
Сохраняйте в PageEntry только метаданные. Используйте buildPage, чтобы сопоставить каждый ключ страницы с нужным виджетом.
Сериализуемое состояние
PageEntry — обычные данные, поэтому состояние навигации можно логировать, сравнивать и воспроизводить.
Простой резолвер
Переключатель по page.key делает маршрутизацию явной и обозримой.
Единственный источник истины
Push и pop — это операции над списком _pages, а не побочные эффекты.
Шаблон резолвера
Build by page key and mutate the page список declaratively.
Правило состояния страницы
Пример резолвера
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 в состоянии навигации и держите PageEntry как чистые метаданные ради поддерживаемости.