toNavigationDestination method

Column toNavigationDestination(
  1. BuildContext context,
  2. OudsNavigationBarControlState controlState, {
  3. required bool isSelected,
  4. required int index,
  5. required int total,
  6. VoidCallback? onTap,
})

Creates the destination widget tree for this OudsNavigationBarItem.

This is intended to be used by OudsNavigationBar on Android with Material. Internally, OudsNavigationBar is backed by the Material 3 NavigationBar and NavigationDestination widgets.

  • context is used to access theme tokens and layout values.
  • controlState drives icon/top-indicator colors according to the current OUDS navigation control state.
  • isSelected indicates whether this destination is currently selected.
  • index zero-based position of this item in the navigation bar.
  • total total number of destinations in the navigation bar.

Implementation

Column toNavigationDestination(
  BuildContext context,
  OudsNavigationBarControlState controlState, {
  required bool isSelected,
  required int index,
  required int total,
  VoidCallback? onTap,
}) {
  final modifier = OudsNavigationBarStatusModifier(context);
  final bar = OudsTheme.of(context).componentsTokens(context).bar;

  // Builds the full TalkBack label: "Label[, badge], Tab X of Y"
  final localizations = MaterialLocalizations.of(context);
  final contentLabel = OudsNavigationBarA11y.buildTabSemanticLabel(
    label,
    badge,
  );
  final fullSemanticLabel =
      '$contentLabel, ${localizations.tabLabel(tabIndex: index + 1, tabCount: total)}';

  return Column(
    mainAxisSize: MainAxisSize.min,
    children: [
      // Android: no external controller, uses internal animation
      _buildTopIndicatorBar(context, bar, isSelected, controlState, index),
      Flexible(
        child: Semantics(
          // Override NavigationDestination's internal semantics to enforce
          // the correct reading order: "Label[, badge], Tab X of Y".
          // onTap restores the activation action lost by ExcludeSemantics.
          label: fullSemanticLabel,
          selected: isSelected,
          onTap: onTap,
          child: ExcludeSemantics(
            // Suppresses NavigationDestination's own semantic nodes,
            // which would otherwise produce a wrong TalkBack reading order.
            child: NavigationDestination(
              label: label,
              icon: _buildBadgeIconNavigationDestination(
                context,
                icon,
                modifier,
                controlState,
                badge,
                isSelected: isSelected,
              ),
              selectedIcon: _buildBadgeIconNavigationDestination(
                context,
                icon,
                modifier,
                controlState,
                badge,
                isSelected: isSelected,
              ),
            ),
          ),
        ),
      ),
    ],
  );
}