Deterministic Back Behavior
Define a single back policy so overlay dismissal and stack pops always happen in the same order.
Overlay-first
Dismiss active overlays before popping page stacks.
Root-aware
When stack length is one, delegate to parent behavior instead of force-pop.
Tab-aware
In tab mode, move to first tab at root before triggering app-level exit handling.
Back Scope Pattern
Use DeclarativePagesBackScope for page stacks and tab callbacks for tab roots.
Back Policy
DeclarativePagesBackScope
return DeclarativePagesBackScope(
pages: _pages,
popTopPage: _popTop,
isOverlayVisible: _overlay != null,
dismissOverlay: _dismissOverlay,
onBackAtRoot: _onBackAtRoot,
child: DeclarativePagesNavigator(
pages: _pages,
buildPage: _buildPage,
onPopTop: _popTop,
canPopTop: () => _overlay == null,
),
);
UX Stability
Keep one consistent order for all back events to avoid user confusion between Android kerfi back and iOS gestures.
Previous
Declarative TabsNext
Anti-patterns