buildSidebar method
Renders a Sidebar for expansive navigation, optional as drawer overlay.
Builds ArcaneSidebar with NavItems as buttons, supporting headers/footers via sidebarHeader and sidebarFooter. For drawers, handles state expansion and backdrop transforms with drawerTransformsBackdrop, integrating Pylon for signal management. Uses sidebarSpacing for separators, ensuring performant rendering with Arcane.closeDrawer on selection in overlay mode. Aligns with endSide for RTL/LTR support in ArcaneTheme.
Implementation
Widget buildSidebar(BuildContext context, int index, {bool drawer = false}) =>
ArcaneSidebar(
width: sidebarWidth,
children: (context) => [
if (sidebarPrefixPadding > 0)
SizedBox(height: sidebarPrefixPadding),
...tabs.mapIndexed((e, i) => switch (e) {
NavTab e => ArcaneSidebarButton(
icon: Icon(
index == i ? e.selectedIcon ?? e.icon : e.icon),
label: e.label ?? "Item ${index + 1}",
selected: index == i,
onTap: () {
if (drawer) {
Arcane.closeDrawer(context);
}
if (index != i) {
_onChanged(i);
}
},
),
NavItem e => e.builder(context),
})
].joinSeparator(SizedBox(
height: sidebarSpacing ??
ArcaneTheme.of(context).navigationScreen.sidebarSpacing)),
header: sidebarHeader == null
? null
: drawer
? (context) =>
context.streamPylon<ArcaneSidebarState?>().build((st) {
if (st == ArcaneSidebarState.collapsed) {
Arcane.closeDrawer(context);
}
context.setPylon(ArcaneSidebarState.expanded);
return Pylon<ArcaneDrawerSignal?>(
local: true,
value: ArcaneDrawerSignal(true),
builder: sidebarHeader,
);
})
: sidebarHeader,
footer: sidebarFooter == null
? null
: drawer
? (context) =>
context.streamPylon<ArcaneSidebarState?>().build((st) {
if (st == ArcaneSidebarState.collapsed) {
Arcane.closeDrawer(context);
}
context.setPylon(ArcaneSidebarState.expanded);
return Pylon<ArcaneDrawerSignal?>(
local: true,
value: ArcaneDrawerSignal(true),
builder: sidebarFooter,
);
})
: sidebarFooter);