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.