buildNavigationRail method
Constructs a NavigationRail for compact vertical navigation.
Displays NavItems as icon buttons with color-coded selection via
Theme.of(context).colorScheme.primary. Includes a back button if
Navigator.canPop is true, supporting hierarchical routing. Padded
with railTopPadding for ergonomic placement, it expands content
horizontally with Expanded for full-screen views, minimizing
layout shifts in AbstractScreen extensions.
Implementation
Widget buildNavigationRail(BuildContext context, int index) => Column(
mainAxisSize: MainAxisSize.max,
children: [
const Gap(5),
if (Navigator.canPop(context))
SafeArea(
top: true,
child: GhostButton(
density: ButtonDensity.icon,
child: context.inSheet
? const Icon(Icons.x_bold)
: const Icon(Icons.caret_left_bold),
onPressed: () => Arcane.pop(context))),
...tabs
.mapIndexed((tab, railIndex) => switch (tab) {
NavTab tab => IconButton(
icon: Icon(
railIndex == index
? (tab.selectedIcon ?? tab.icon)
: tab.icon,
color: railIndex == index
? Theme.of(context).colorScheme.primary
: null),
onPressed: index == railIndex
? null
: () => _onChanged(railIndex),
),
NavItem item => item.builder(context),
})
.toList(),
],
).padTop(railTopPadding ??
ArcaneTheme.of(context).navigationScreen.railTopPadding);